我已经看过这个问题的几个不同版本,但很难将它应用到我需要的......
MS SQL Server 2008查询:
SELECT Receipts.ReceiptID, Receipts.UserID, Receipts.UserCardID, FolderLink.ReceiptFolderLinkID
FROM dbo.tbl_ReceiptFolderLnk AS FolderLink
INNER JOIN dbo.tbl_Receipt AS Receipts ON FolderLink.ReceiptID = Receipts.ReceiptID
**
ReceiptID UserID UserCardID ReceiptFolderLinkID
-------------------- -------------------- -------------------- --------------------
1 1 3 2
2 1 3 3
3 1 3 10
4 1 4 11
5 1 4 13
6 2 5 14
3 1 3 15
4 1 4 16
**
现在我想在ReceiptID上获得不同的值。使用distinct不会在整行上作为不同的工作。
帮助将不胜感激。
谢谢!
答案 0 :(得分:2)
如果您想要原始查询中的所有结果列并希望每个ReceiptID只显示一次,则需要使用GROUP BY。
像:
SELECT Receipts.ReceiptID,
MIN(Receipts.UserID),
MIN(Receipts.UserCardID),
MIN(FolderLink.ReceiptFolderLinkID)
FROM dbo.tbl_ReceiptFolderLnk AS FolderLink
INNER JOIN dbo.tbl_Receipt AS Receipts ON FolderLink.ReceiptID = Receipts.ReceiptID
GROUP BY Receipts.ReceiptID
答案 1 :(得分:1)
要求具有相同receiptID的多行中的一行是不明确的。你想如何从其他行中选择一行?
答案 2 :(得分:1)
我使用MIN或MAX聚合函数完成了这项工作,它似乎工作得很好,并且比我见过的其他大多数方法都要简单易用。
所以它是这样的:
SELECT [ColumnA], MIN(ColumnB) AS ColumnB, MIN(ColumnC) AS ColumnC
FROM MyTable
GROUP BY ColumnA
在这种情况下,ColumnA将是不同的列。
答案 3 :(得分:0)
DISTINCT与整行不同。试试GROUP BY ReceiptID
,当然其他列的值可能没有意义,因为它只会选择一行。
答案 4 :(得分:0)
SELECT Receipts.ReceiptID, Receipts.UserID, Receipts.UserCardID, ReceiptFolderLinkID
FROM dbo.tbl_Receipt AS Receipts
CROSS APPLY
(
SELECT TOP 1 FolderLink.ReceiptFolderLinkID
FROM dbo.tbl_ReceiptFolderLnk FolderLink
WHERE FolderLink.ReceiptID = Receipts.ReceiptID
ORDER BY
FolderLink.ReceiptFolderLinkID
) fl
这将消除对GROUP BY
或DISTINCT
的需求,这可能是非常不理想的。
同样通过更改ORDER BY
子句,您可以选择在有多个时要返回的FolderLink
。