すべてのテーブルからすべてのレコードを取得できるように、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 つの行を取得しないでください。