-3

SQL 演算子を検索して取得しようとしていますExistsが、SQL Server 2008 で自分で実行するまで理解できませんでしたが、まだ明確ではありません。ヘルプ

例えば

実際に何をするかを確認するために自分でいくつかのクエリを実行したことを参照してください。

// using IN
select 
    customers.cus_id, customers.cusName 
from 
    customers 
where 
    customers.cus_id IN (Select cus_id from products 
                         where prodCategory= 'Consumer electronics')

// using Exists
Select 
    customers.cus_id, customers.cusName 
from 
    customers
where 
    exists (select cus_id from products 
            where prodCategory = 'Consumer electronics' AND customers.cus_id = products.cus_id)

どちらも同じ結果になりますが、2番目のクエリのサブクエリからこの部分を削除すると

......AND customers.cus_id=products.cus_id

その後、正しい結果が得られず、すべてのレコードがCustomersテーブルから返されます。なんで?これで私の概念はクリアになると思いますが、助けはほとんど必要ありません。助けてください!

4

4 に答える 4

0

このクエリ:

Select cus_id from products where prodCategory= 'Consumer   electronics'

一致する家電製品cus_idを持つすべての値のリストを返します。この句は、がそのリストに含まれている場合、行が返されることを意味します。そのため、AND が組み込まれています。prodCategoryINcustomers.cus_id

ただし、このEXISTS句は、サブクエリに行が含まれている場合に行が返されることを意味します。そのサブクエリの値が何であるかは気にしません。ANDしたがって、一致しない他の行が返されないようにするには、を追加する必要がありますcustomers.cus_id

于 2013-11-08T23:55:07.393 に答える
0

両方の演算子を使用して同じ結果を取得できます。実例に入る前に、いくつか例を挙げてみましょう。

SELECT * FROM TABLE_1 returns records as shown below

Field1
1
2
3
4

SELECT * FROM TABLE_2 returns

Field2  Field3
1            4
2            6
3            7 
4            8

TABLE_2 の「Field3」に存在する TABLE_1 のデータを取得する場合は、IN 演算子を使用してクエリを次のように使用できます。

SELECT * FROM TABLE_1
WHERE FIELD1 IN ( SELECT FIELD3 FROM TABLE_2)

EXISTS を使用したクエリを次のように使用することもできます。

SELECT * FROM TABLE_1
WHERE EXISTS(    SELECT ‘X’
FROM TABLE_2
WHERE TABLE_1.FIELD1 = TABLE_2.FIELD3
)

EXISTS を使用する場合は、常にサブクエリで where 句を使用してテーブルを結合します。そうしないと、メイン テーブルからすべてのレコードを取得することになります。たとえば、以下のクエリを検討する場合

SELECT * FROM TABLE_1
WHERE EXISTS(    SELECT Field3
FROM TABLE_2

)

TABLE_1 からすべてのレコードをフェッチし、クエリと同じです

SELECT * FROM TABLE_1

他の違いはパフォーマンスにあります(外部/内部クエリで選択されたテーブルに応じて)。EXISTS は IN よりも高速に動作します。詳細については、上記のクエリのパフォーマンス プランを確認できます。

于 2013-11-08T23:56:01.723 に答える