1

私はそれほど複雑ではないが十分に混乱しているSQLを持っているので、私は同等のものを持っているか、偶然にもカウントが同じであると疑問に思っています。

SQL1:

SELECT a, b
FROM table1
WHERE NOT EXISTS(
  SELECT a, c
  FROM TABLE2
  WHERE table2.a != table1.a)

SQL2

SELECT table1.a, table1.b
FROM table1
LEFT JOIN table2 ON table2.a = table1.a
WHERE table2.a IS NULL

2つのカウントは同じですが、これが偶然であるかどうかはわかりません。変換によって元の機能が変更されないようにしたいと思います。

4

4 に答える 4

3

それは同じようには見えませんが、近いです。LEFTJOIN構文は次と同じです。

SELECT a, b
FROM table1
WHERE NOT EXIST(
  SELECT a, c
  FROM TABLE2
  WHERE table2.a = table1.a)

ただし、「!=」ではなく「=」に注意してください。それはあなたが持っているものではないのですか?

実際のクエリは、「一致しない行が存在しない」などのように変換されます。これは奇妙なことですが、JOIN条件を変更することで表現できます。

SELECT a, b
FROM table1
LEFT JOIN table2 ON table2.a != table1.a
WHERE table2.a IS NULL
于 2012-03-09T15:46:16.120 に答える
2

最初のクエリは、あなたが持っているように、TABLE2aのすべての値に一致するTABLE1のすべての行を返します。したがって、 TABLE2にnull以外の値が1つあり、その値がTABLE1に存在しない限りa、ゼロ行が返されます。その場合、その値が。のTABLE1にあるのと同じ数の行が返されます。aa

2番目のクエリは完全に異なります。aTABLE2に存在しないTABLE1のすべての行を返すだけです。

つまり、「すべてに一致する」(クエリ1)と「一致しない」(クエリ2)になります。同じ数の行を取得しているという事実は、まったくの偶然です。

次のように、最初のクエリで変更!=した場合、クエリは同等になります。=

SELECT a, b
FROM table1
WHERE NOT EXISTS(
  SELECT a, c
  FROM TABLE2
  WHERE table2.a = table1.a)

aこれにより、table2に存在しないtable1の値が取得されます。これは、次とまったく同じです。

SELECT table1.a, b
FROM table1
LEFT JOIN table2 ON table2.a = table1.a
WHERE table2.a IS NULL

あなたがそれを持っているように、それらは同等ではありません。あなたはそれらをそうするために最初のもので変更しなければなりませ!==

于 2012-03-09T15:46:41.893 に答える
2

最初のクエリの場合、つまり

SELECT a, b
FROM table1
WHERE NOT EXISTS(
  SELECT a, c
  FROM TABLE2
  WHERE table2.a != table1.a)

aこれは、 inのすべての値table1が同じ1つの値であり、のすべての行table2が同じ1つの値であるtable1table2、空のセットである場合に、すべての行を返します。それ以外の場合、結果は空のセットになります。

同じことを2番目のクエリと同じにすることはできません。

于 2012-03-09T16:29:45.533 に答える
1
SELECT a, b, c , d
FROM table1 t1
WHERE NOT EXISTS( SELECT * FROM table2 nx
  WHERE nx.y = t1.a
  )
  ;

この(「相関サブクエリ」)メソッドの大きな利点が1つあります。テーブルtable2は外部クエリからは見えず、汚染したり、考えを混乱させたりすることはできません。サブクエリは、存在するか存在しないかのいずれかの1ビットの情報を生成するだけです。生きるべきか、死ぬべきか...。
その点で、LEFT JOINイディオムは厄介です。これは、外部クエリxxx IS NULLで条件を確認する必要があるのに対し、xxxは内部クエリからtable2を参照しているためです。

技術的には違いはありません。

于 2012-03-09T16:26:13.717 に答える