1

私は3つのSQLテーブルを持っています:

Data36 (Data_ID:int <PK>, type:int), 
Data38(Data_ID:int <PK>, clientId:int), 
Data47(Data_ID:int <PK>, payerID:int).

ここでは集計関数を使用せず、GROUP BYはDISTINCTと同じように動作する必要があるため、次のクエリは同じだと思いました。しかし、それらは非常に異なる結果セットを返し、その理由はわかりません。これらのクエリ間の違いを理解するのを手伝ってください。

クエリ1(153行を返します):

SELECT payer.Data_ID, payer.type
 FROM Data36 AS payer
 JOIN Data38 AS serv ON payer.Data_ID = serv.clientId
 WHERE ((SELECT count(*) FROM Data47 AS regsites WHERE regsites.payerID = payer.Data_ID) = 0)
 GROUP BY payer.Data_ID, payer.type

クエリ2(4744行を返します):

SELECT DISTINCT payer.Data_ID, payer.type
 FROM Data36 AS payer
 JOIN Data38 AS serv ON payer.Data_ID = serv.clientId
 WHERE ((SELECT count(*) FROM Data47 AS regsites WHERE regsites.payerID = payer.Data_ID) = 0)

SQLServerのバージョンは5.0.40です。

より具体的な情報が必要な場合はお知らせください。

更新:これについて言及しなくて申し訳ありません:Data_IDはこれらのテーブルの主キーであるため、Data_IDはこれらのテーブルの各レコードに対して一意です。

SELECT count( *  ) FROM Data36 
--returns 5998
SELECT count(DISTINCT Data_ID) FROM Data36 
--returns 5998

更新2:クエリ1で、「GROUP BYpayer.Data_ID」を「GROUPBYpayer.Data_ID、payer.type」に変更しました。結果は同じです-153行。

4

3 に答える 3

0

これを試すとどうなりますか?

select payer.Data_ID, payer.type from
(
SELECT DISTINCT Data_ID, type 
 FROM Data36
) AS payer 
 JOIN Data38 AS serv ON payer.Data_ID = serv.clientId 
 WHERE ((SELECT count(*) FROM Data47 AS regsites WHERE regsites.payerID = payer.Data_ID) = 0) 
于 2010-06-21T13:51:20.227 に答える
0

クエリを見ると、機能的な違いが1つだけあるようです...

クエリ 1 (153 レコード):

SELECT payer.Data_ID, payer.type FROM <blah> GROUP BY payer.Data_ID

クエリ 2 (4744 レコード):

SELECT DISTINCT payer.Data_ID, payer.type FROM <blah>


Query1 は Data_ID によってのみグループ化されるため、153 個の Data_ID がありますが、各 Data_ID には多くの異なる型の値を含めることができます。

Query2 はすべての異なる Data_ID/type の組み合わせを返しますが、Query1 は Data_ID ごとに 1 つのレコードのみを返します。


type フィールドの周りに MIN/MAX などの集計関数が必要になると予想されるため、Query1 がまったく実行されることにも驚いています。

于 2010-06-21T14:26:32.320 に答える
0

3 番目のテーブルに対応するレコードがないレコードを見つけるための正確で最も効率的な方法は次のとおりです。

SELECT payer.Data_ID, payer.type
FROM Data36 AS payer
JOIN Data38 AS serv ON payer.Data_ID = serv.clientId
LEFT JOIN Data47 AS regsites  ON(regsites.payerID = payer.Data_ID)
WHERE regsites.payerID IS NULL
GROUP BY payer.Data_ID
于 2010-06-21T14:00:01.923 に答える