半結合の概念と、従来の結合との違いを理解しようとすると、問題が発生します。すでにいくつかの記事を試しましたが、説明に満足していません。誰かがそれを理解するのを手伝ってもらえますか?
簡単な例。左外部結合を使用して成績を持つ学生を選択しましょう:
SELECT DISTINCT s.id
FROM students s
LEFT JOIN grades g ON g.student_id = s.id
WHERE g.student_id IS NOT NULL
左半結合でも同じです:
SELECT s.id
FROM students s
WHERE EXISTS (SELECT 1 FROM grades g
WHERE g.student_id = s.id)
後者の方がはるかに効率的です。
私の知る限り、SEMIJOIN/ANTISEMI
をサポートするSQLダイアレクトはU-SQL/Cloudera Impalaです。
セミジョインは、行を別の行セットに含めることに基づいて行セットをフィルターするU-SQLの方法です。他のSQLダイアレクトは、SELECT * FROM A WHERE A.key IN(SELECT B.key FROM B)パターン。
詳細情報 SQLでの半結合と反結合には独自の構文が必要 :
「セミ」は、実際には右側に参加しないことを意味します。特定のタプルに対して結果が得られるかどうかのみをチェックします。
-- IN
SELECT *
FROM Employee
WHERE DeptName IN (
SELECT DeptName
FROM Dept
)
-- EXISTS
SELECT *
FROM Employee
WHERE EXISTS (
SELECT 1
FROM Dept
WHERE Employee.DeptName = Dept.DeptName
)
編集:
SEMI/ANTISEMI結合をサポートする別の方言は [〜#〜] kql [〜#〜] :
kind = leftsemi(またはkind = rightsemi)
右側から一致するすべてのレコードを左側から返します。結果表には、左側の列のみが含まれます。
let t1 = datatable(key:long, value:string)
[1, "a",
2, "b",
3, "c"];
let t2 = datatable(key:long)
[1,3];
t1 | join kind=leftsemi (t2) on key
出力:
key value
1 a
3 c