SQL Server不同,选择所有行

问题描述:

我在这个主题上看到了很多问题和答案,但我很难理解我在做什么错误,下面的查询获取我需要的所有信息,但是如果它有多行,当r_num是相同的,并且每个r_num的r_order是相同的,那么对于每个r_num我只有一个结果,现在虽然这个调用给了我错误,有人请向我解释Distinct是如何工作的,我该如何使用它在此查询实现我的目标是什么?SQL Server不同,选择所有行

SELECT DISTINCT po_num, r_num, r_order, vendor, order_date, received_by, received_date FROM(
    SELECT p.id as po_num, r.id as r_num, r.rec_order as r_order, v.name as vendor, p.order_date, r.received_by, r.received_date 
    FROM Parts.dbo.po as p INNER JOIN 
    Parts.dbo.vendor as v ON v.id = p.vendor__id INNER JOIN 
    Parts.dbo.receipts as r ON r.id = 'R-'+CAST(p.id AS varchar) 
    GROUP BY p.id, r.id, r.rec_order, v.name, p.order_date, r.received_by, r.received_date) as tbl 
GROUP BY r_num, r_order 

以下是错误我得到

Msg 8120, Level 16, State 1, Line 1 Column 'tbl.po_num' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

+0

你得到了什么错误? – ekad 2014-11-06 16:11:37

+0

编辑显示错误 – 2014-11-06 16:13:00

+0

错误说明了这一切......并且'DISTINCT'不是这里的问题,它是你的分组 – Tanner 2014-11-06 16:14:35

除非你在做聚合,否则你不需要同时拥有DISTINCT和GROUP BY。

SELECT DISTINCT po_num, r_num, r_order, vendor, order_date, received_by, received_date 
FROM 
    (
    SELECT p.id as po_num, r.id as r_num, r.rec_order as r_order, v.name as vendor, p.order_date, r.received_by, r.received_date 
    FROM Parts.dbo.po as p INNER JOIN 
    Parts.dbo.vendor as v ON v.id = p.vendor__id INNER JOIN 
    Parts.dbo.receipts as r ON r.id = 'R-'+CAST(p.id AS varchar) 
    GROUP BY p.id, r.id, r.rec_order, v.name, p.order_date, r.received_by, r.received_date 
) as tbl 

如果你想获得不同r_num和r_order值,则需要任何一组由/只选择两列:

SELECT r_num, r_order 
FROM 
    (
    SELECT p.id as po_num, r.id as r_num, r.rec_order as r_order, v.name as vendor, p.order_date, r.received_by, r.received_date 
    FROM Parts.dbo.po as p INNER JOIN 
    Parts.dbo.vendor as v ON v.id = p.vendor__id INNER JOIN 
    Parts.dbo.receipts as r ON r.id = 'R-'+CAST(p.id AS varchar) 
    GROUP BY p.id, r.id, r.rec_order, v.name, p.order_date, r.received_by, r.received_date 
) as tbl 
GROUP BY r_num, r_order 

或者,如果你的数据可以处理它,使用额外列上的聚合:

SELECT MAX(po_num) AS po_num, r_num, r_order, MAX(vendor) AS vendor -- etc. 
FROM 
    (
    SELECT p.id as po_num, r.id as r_num, r.rec_order as r_order, v.name as vendor, p.order_date, r.received_by, r.received_date 
    FROM Parts.dbo.po as p INNER JOIN 
    Parts.dbo.vendor as v ON v.id = p.vendor__id INNER JOIN 
    Parts.dbo.receipts as r ON r.id = 'R-'+CAST(p.id AS varchar) 
    GROUP BY p.id, r.id, r.rec_order, v.name, p.order_date, r.received_by, r.received_date 
) as tbl 
GROUP BY r_num, r_order 
+0

所以唯一的时间,然后我需要实际使用DISTINCT关键字是如果我试图找到某些列的SUM,或者一个函数可能会发生多个结果? – 2014-11-06 16:21:40

+0

不完全:当您需要查找SUM()(或任何其他聚合)时使用'GROUP BY'。至于DISTINCT,只有在查询中有多个完全相同的行时才需要它 - 它适用于所有返回的列。我通常会发现,在大多数情况下,在发生这种情况时,我会在JOIN中做错事情... – AHiggins 2014-11-06 16:23:27

+0

啊,这很有道理,所以总结一下,确保我的JOIN在出发前是正确和简洁的其他地方。 – 2014-11-06 16:24:29