web-dev-qa-db-ja.com

データベースの準結合とは何ですか?

半結合の概念と、従来の結合との違いを理解しようとすると、問題が発生します。すでにいくつかの記事を試しましたが、説明に満足していません。誰かがそれを理解するのを手伝ってもらえますか?

14
DarkShadow

簡単な例。左外部結合を使用して成績を持つ学生を選択しましょう:

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)

後者の方がはるかに効率的です。

17
Iurii Ant

私の知る限り、SEMIJOIN/ANTISEMIをサポートするSQLダイアレクトはU-SQL/Cloudera Impalaです。

[〜#〜] semijoin [〜#〜]

セミジョインは、行を別の行セットに含めることに基づいて行セットをフィルターする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
8
Lukasz Szozda