我知道这个问题一次又一次被问到,但我没有两个相同的列名,但我得到了:
Msg 8120,Level 16,State 1,Line 13 Column' dbo.PRODUCT.ProductName' 在选择列表中无效,因为它不包含在任何一个中 聚合函数或GROUP BY子句。
我的ProductId列对于我的dbo.Product表是唯一的,我不确定为什么它会与另一个值混淆。在此图像中,您可以看到dup ProductIds
WITH products AS
(
SELECT
*,
ROW_NUMBER() OVER(ORDER BY p.[ProductName]) AS 'RowNumber'
FROM dbo.PRODUCT p
JOIN dbo.Category c ON p.ProductCategoryCode = c.CategoryCode
JOIN dbo.Supplier s ON p.ProductSupplierCode = s.SupplierCode
LEFT JOIN dbo.ProductTag pt ON pt.ProductUPC = p.UPC
LEFT JOIN dbo.Tag t ON pt.ProductTagTagCode = t.TagCode
GROUP BY p.ProductId
)
SELECT *
FROM products
WHERE RowNumber BETWEEN 0 AND 2;
答案 0 :(得分:1)
您的错误是因为您正在选择所有表中的所有字段,但您只按一个值进行分组。如果查询返回一个值,则它必须是GROUPED或聚合的(Min,Max,SUM,AVG等)。
如果您只是将产品名称添加到分组中:
GROUP BY p.ProductId, p.ProductName
你仍然会遇到同样的问题(例如)p.ProductCategoryCode,p.ProductSupplierCode,c.CategoryCode等等。
在这种情况下,如果您要查找唯一的行,请不使用GROUP BY
- 使用DISTINCT
(适用于自动返回的所有字段)。请注意,@ bjones仍然是正确的,因为您获得重复的原因 - 您加入的其中一个表可以为每个产品分配多行(例如,产品很多次来自多个供应商。)
要解决此问题,您需要:
GROUP BY
,或DISTINCT