以下の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でレコードを返したいのですが、存在しないレコードに参加するにはどうすればよいですか?または、これは単に不可能ですか?代替手段は何ですか?
外部結合を正しく使用しているにもかかわらず、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句がテーブルの結合結果をフィルタリングすることです。外部結合を使用しているが、外部結合されたテーブルでフィルタリングする場合は、結合の反対側にレコードが存在しない場合を処理する必要があります。