table1
次のようなものがあるとします。
id | itemcode
-------------
1 | c1
2 | c2
...
そして、table2
このような:
item | name
-----------
c1 | acme
c2 | foo
...
次の 2 つのクエリは、すべての条件下で同じ結果セットを返しますか?
SELECT id, itemcode
FROM table1
WHERE itemcode IN (SELECT DISTINCT item
FROM table2
WHERE name [some arbitrary test])
SELECT id, itemcode
FROM table1
JOIN (SELECT DISTINCT item
FROM table2
WHERE name [some arbitrary test]) items
ON table1.itemcode = items.item
ばかげたことを本当に見逃していない限り、私はそう言うでしょう。しかし、この形式に要約される 2 つのクエリを実行したところ、異なる結果が得られました。WHERE IN を使用したネストされたクエリがいくつかありますが、最後のステップでは、JOIN の方がはるかに高速であることに気付きました。ネストされたクエリはすべて完全に分離されているため、問題があるとは思わないので、上記に関して誤解している可能性を排除したいだけです。
洞察をありがとう。
編集
2 つの元のクエリ:
SELECT imitm, imlitm, imglpt
FROM jdedata.F4101
WHERE imitm IN
(SELECT DISTINCT ivitm AS itemno
FROM jdedata.F4104
WHERE ivcitm IN
(SELECT DISTINCT ivcitm AS legacycode
FROM jdedata.F4104
WHERE ivitm IN
(SELECT DISTINCT tritm
FROM trigdata.F4101_TRIG)
)
)
SELECT orig.imitm, orig.imlitm, orig.imglpt
FROM jdedata.F4101 orig
JOIN
(SELECT DISTINCT ivitm AS itemno
FROM jdedata.F4104
WHERE ivcitm IN
(SELECT DISTINCT ivcitm AS legacycode
FROM jdedata.F4104
WHERE ivitm IN
(SELECT DISTINCT tritm
FROM trigdata.F4101_TRIG))) itemns
ON orig.imitm = itemns.itemno
編集2
クエリが異なる結果を返した理由はまだわかりませんが、いくつかの部分で間違った列を使用していたため、最初からロジックに欠陥があったようです。上記のようにクエリの解釈を間違えた、またはタイプミスがあったと言っているわけではありません。別のものを選択する必要があっただけです。
普段はこういうことを理解するまで休まないのですが、とても疲れていて、1月以来初めての連休に突入するので、今さら検索する気にはなれません。 . ここで紹介したヒントは、後で役に立つと確信しています。すべてのヘルプに対して賛成票が配布され、Ypercube の回答を受け入れました。これは主に、彼のコメントが私を最も遠ざけたからです。でも、ずっとありがとう!後で詳細が判明した場合は、再度 ping を実行したことを思い出そうとします。