在一列上获取DISTINCT有点模糊?

时间:2009-10-09 14:54:30

标签: sql-server distinct row

我已经看过这个问题的几个不同版本,但很难将它应用到我需要的......

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不会在整行上作为不同的工作。

帮助将不胜感激。

谢谢!

5 个答案:

答案 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 BYDISTINCT的需求,这可能是非常不理想的。

同样通过更改ORDER BY子句,您可以选择在有多个时要返回的FolderLink