web-dev-qa-db-ja.com

レコードが存在しない場合でも行を返すLEFT OUTER JOIN

以下の2つのテーブルがあります。

Table_1
[Group No] [Test No] [Description]
123        1         [First Test]
123        2         [Second Test]
123        3         [Third Test]

Table_2
[Sample No] [Test No] [Result Description]
ABC         1         [Some More Result]
ABC         3         [Some Result]
DEF         1         [A Result]
DEF         2         [Results More]
DEF         3         [Bad Results]

私のクエリは次のとおりです。

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description]
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No]
WHERE (Table_1.[Group No] = '123') AND (Table_2.[Sample No] = 'ABC')

djacobsonのクエリ:

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description]
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No]
WHERE (Table_1.[Group No] = '123') 
  AND (Table_2.[Sample No] IS NULL OR Table_2.[Sample No] = 'ABC')

これは返します:

[Group No] [Test No] [Description] [Result Description]
123        1         [First Test]  [Some More Result]
123        3         [Third Test]  [Some Result]

しかし、私が本当に欲しいのは:

[Group No] [Test No] [Description] [Result Description]
123        1         [First Test]  [Some More Result]
123        2         [Second Test] NULL
123        3         [Third Test]  [Some Result]

これは可能ですか?テストNo 2でレコードを返したいのですが、存在しないレコードに参加するにはどうすればよいですか?または、これは単に不可能ですか?代替手段は何ですか?

25
KayBee

外部結合を正しく使用しているにもかかわらず、WHERE句にそのテーブルの列を含めることで、Table_2に値が存在する場合に結果セットを制限しています。サンプル番号がABCのレコードが必要な場合、OR Table_2にレコードがありません。これを行う必要があります。

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description]
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No]
WHERE (Table_1.[Group No] = '123') 
  AND (Table_2.[Sample No] IS NULL OR Table_2.[Sample No] = 'ABC')

あるいは、Table_2に参加するときにTable_2の結果をフィルター処理することもできます(この場合は、もう少しきれいに読み取ります)。

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description]
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] AND Table_2.[Sample No] = 'ABC'
WHERE (Table_1.[Group No] = '123') 

それは同じことを達成するはずです。ここで重要なことは、WHERE句がテーブルの結合結果をフィルタリングすることです。外部結合を使用しているが、外部結合されたテーブルでフィルタリングする場合は、結合の反対側にレコードが存在しない場合を処理する必要があります。

43
Dan J