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)

SQL Server 版本是 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 BY payer.Data_ID' 更改为 'GROUP BY payer.Data_ID, payer.type'。结果仍然相同 - 153 行。

4

3 回答 3

0

查看您的查询似乎只有一个功能差异......

查询 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/类型组合,但 Query1 只为每个 Data_ID 返回 1 条记录。


我也对 Query1 完全运行感到惊讶,因为我希望您需要在 type 字段周围有一个聚合函数,例如 MIN/MAX。

于 2010-06-21T14:26:32.320 回答
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

在第三个表中找到没有对应记录的记录的正确和最有效的方法是:

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 回答