3

すべてのテーブルからすべてのレコードを取得できるように、3 つのテーブルを結合 (完全外部結合を実行) しています。私が直面している問題は、テーブルを結合する順序にあります。

テーブル情報

代替テキスト http://img235.imageshack.us/img235/7980/tableinfoow1.png

(1) TABLE1、TABLE2、TABLE3 の順序でテーブルを結合すると、チーム B とレベル 1 のレコードに対して 2 つの行が得られます。

SELECT DISTINCT 
    (CASE WHEN T0.[TEAM] IS NOT NULL THEN T0.[TEAM] WHEN T1.[TEAM] IS NOT NULL THEN T1.[TEAM] WHEN T2.[TEAM] IS NOT NULL THEN T2.[TEAM] ELSE T0.[TEAM] END) AS [TEAM], 
    (CASE WHEN T0.[LEVEL] IS NOT NULL THEN T0.[LEVEL] WHEN T1.[LEVEL] IS NOT NULL THEN T1.[LEVEL] WHEN T2.[LEVEL] IS NOT NULL THEN T2.[LEVEL] ELSE T0.[LEVEL] END) AS [LEVEL], 
    T0.[VALUE1] AS [VALUE1], 
    T1.[VALUE2] AS [VALUE2], 
    T2.[VALUE3] AS [VALUE3] 

FROM TABLE1 T0
FULL JOIN TABLE2 T1 ON T0.[TEAM] = T1.[TEAM] AND T0.[LEVEL] = T1.[LEVEL] 
FULL JOIN TABLE3 T2 ON T0.[TEAM] = T2.[TEAM] AND T0.[LEVEL] = T2.[LEVEL]

(2) TABLE2、TABLE3、TABLE1 シーケンスでテーブルを結合すると、出力で正しい行数が得られます。

SELECT DISTINCT 
    (CASE WHEN T0.[TEAM] IS NOT NULL THEN T0.[TEAM] WHEN T1.[TEAM] IS NOT NULL THEN T1.[TEAM] WHEN T2.[TEAM] IS NOT NULL THEN T2.[TEAM] ELSE T0.[TEAM] END) AS [TEAM], 
    (CASE WHEN T0.[LEVEL] IS NOT NULL THEN T0.[LEVEL] WHEN T1.[LEVEL] IS NOT NULL THEN T1.[LEVEL] WHEN T2.[LEVEL] IS NOT NULL THEN T2.[LEVEL] ELSE T0.[LEVEL] END) AS [LEVEL], 
    T0.[VALUE1] AS [VALUE1], 
    T1.[VALUE2] AS [VALUE2], 
    T2.[VALUE3] AS [VALUE3] 

FROM TABLE2 T0
FULL JOIN TABLE3 T1 ON T0.[TEAM] = T1.[TEAM] AND T0.[LEVEL] = T1.[LEVEL] 
FULL JOIN TABLE1 T2 ON T0.[TEAM] = T2.[TEAM] AND T0.[LEVEL] = T2.[LEVEL]

私が直面している問題は、入力テーブルを認識しておらず、これらすべてのテーブルを実行時にユーザーからの入力として取得し、結合を実行することです。テーブルは技術的に一度に 3 つ以上のテーブル (最大 9 または 10) をマージできるため、一度に 2 つのテーブルをマージすることはできません。

(完全外部結合を使用して) すべてのテーブルからすべてのレコードを確実に取得する方法はありますが、#1 のように 2 つの行を取得しないでください。

4

4 に答える 4

0

これが FULL OUTER JOIN の定義です (これを使用すると、ほとんどの場合、設計が不十分であることを示します。私は FULL OUTER JOIN を年に 1 回使用します)。

おそらく、あなたが探していた結果を与えたなら?

UNION、GROUP BY、および COALESCE を考えています。

于 2009-01-14T04:54:34.017 に答える
0

必要なのは、2 番目の結合式に追加の一致条件を追加して、2 番目のテーブルのチーム/レベルの値と一致できるようにすることです。また、ISNULL を使用してチーム/レベル列の式を簡略化しました。

SELECT DISTINCT 
    ISNULL(T0.[TEAM],ISNULL(T1.[TEAM],T2.[TEAM])) AS [TEAM],
    ISNULL(T0.[LEVEL],ISNULL(T1.[LEVEL],T2.[LEVEL])) AS [LEVEL],
    T0.[VALUE1], T1.[VALUE2], T2.[VALUE3]     
FROM TABLE1 T0
FULL JOIN TABLE2 T1 ON T0.[TEAM] = T1.[TEAM] AND T0.[LEVEL] = T1.[LEVEL] 
FULL JOIN TABLE3 T2 ON (T0.[TEAM] = T2.[TEAM] AND T0.[LEVEL] = T2.[LEVEL])
                    OR (T1.[TEAM] = T2.[TEAM] AND T1.[LEVEL] = T2.[LEVEL])

見る?T1 は T2 と同じ行に表示されませんでした。

于 2009-09-24T20:58:39.790 に答える
0

AS u が定義する yru クエリが異なるということは、データに重複があるため、この共用体の 1 つに沿って複数のエントリがあることを意味します。

SELECT [TEAM], [LEVEL], MAX(v1) Value1, MAX(v2) Value2, MAX(v3) Value3
FROM (
    SELECT [TEAM], [LEVEL],  v1, NULL v2, NULL v3
    FROM TABLE1
    UNION ALL
    SELECT [TEAM], [LEVEL], NULL v1, V2, NULL v3
    FROM TABLE2
    UNION ALL
    SELECT [TEAM], [LEVEL], NULL V1, NULL V2, V3
    FROM TABLE3
) t0
GROUP BY [TEAM], [LEVEL]
于 2013-03-20T11:09:06.270 に答える