2
  • Productsとを持つの表がp_noありp_descます。
  • その表がありorder_detailsますp_no(上記と同じ)。

p_descにない場所products.p_noが必要order_detailsです。

注: いろいろ検索した結果、このような結果になりました。

-- Why would this work?
select p_desc from products
except
select p_no from order_details

-- Then,
select p_desc from products
where products.p_no not in order_details.p_no

-- and finally,
select p_desc from products
where (p_no not in (select p_no from order_details))

これらのどれかが正しいですか? を使用するように言われましたがexcept、最初のステートメントがどのようにp_noプロパティを比較しているのかわからないので、これは間違っていると思います。

4

2 に答える 2

1

これは宿題なので、詳しくは書きません。

// なぜこれが機能するのでしょうか? order_details から p_no を選択する 以外
の製品から p_desc を選択します

参照: http://technet.microsoft.com/en-us/library/ms188055.aspx
ヒント: 次のコードは同等です:

SELECT p.p_desc FROM products p
LEFT JOIN order_details o ON (o.p_no = p.p_no)
WHERE o.p_no IS NULL

// 次に、 products.p_no が order_details.p_no にない
製品から p_desc を選択します

構文エラーのようです。

// そして最後に、
products
where (p_no not in (select p_no from order_details)) から p_desc を選択します

見栄えがよく、これが最も理解しやすいと思います。

Microsoft のEXCEPT
コメント 使いやすさの議論はわかりますが、そのようなコードを使用すると、コードを別のプラットフォームに移植することが非常に難しくなります。
SQL-92 のコアに近づき、最後のステートメントでフォームを使用することをお勧めします。
それはあなたをより万能なプログラマーにし、単一のプラットフォームへのロックインを防ぎます。これは、仕事の見通しに関する限り良いことです.

機能的な観点から見ると、サンプル A のコードはサンプル C よりも優れているわけではなく、実行にかかる時間はどちらも同じです。

于 2013-10-09T20:54:24.667 に答える
0

最もクリーンな方法は、 を使用することNOT EXISTSです。ここで同様の質問に答えました:

https://dba.stackexchange.com/questions/51270/get-unmatched-rows-for-foreign-key

(その答えは MySQL に関するものですが、T-SQL 構文は同じであることに注意してください。)

あなたの場合、そのクエリは次のようになります。

SELECT p_desc FROM dbo.products AS P
 WHERE (NOT EXISTS (SELECT 1 FROM dbo.order_details AS OD WHERE OD.p_no = P.p_no));
于 2013-10-09T20:54:08.257 に答える