データベースの半結合とは何ですか?
What Is Semi Join Database
解決:
簡単な例。左外部結合を使用して成績のある生徒を選択しましょう。
SELECT DISTINCT s.id FROM student s LEFT JOIN grades g ON g.student_id = s.id WHERE g.student_id IS NOT NULL左半結合でも同じです。
SELECT s.idFROM学生sWHERE EXISTS(SELECT 1FROM成績gWHERE g.student_id = s.id)後者の方がはるかに効率的です。
私の知る限り、サポートするSQL方言SEMIJOIN / ANTISEMIはU-SQL / ClouderaImpalaです。
セミジョイン:
セミジョインは、別の行セットに含まれている行に基づいて行セットをフィルタリングする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']; t2 = datatable(key:long)[1,3]; t1 |キーにkind = leftsemi(t2)を結合します デモ
出力:
キー値1a 3 c