2009-10-09 39 views
1

我已經看到了一些不同版本的問題,但它適用於什麼,我需要有難度......在一列上獲取DISTINCT有點模糊?

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將不會在整行上作爲不同的作品。

幫助將不勝感激。

謝謝!

+2

對於每個ReceiptID,您將獲得UserCardID的多個值,您需要使用哪個值的UserCardId,因爲這會告訴我們如何組合行。 – Mark

回答

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

詢問具有相同receiptID的多行之一是不明確的。你想如何選擇其中一行?

0

DISTINCT對於整行是不同的。嘗試GROUP BY ReceiptID,當然其他列的值可能沒有意義,因爲它只會選擇一行。

+2

這會在我所知道的所有DBMS上失敗。所有選定的列必須是聚合函數或在group by子句中列出。 –

+0

'@Ben S':不會在'MySQL'中失敗,它只會從組中挑選任何隨機記錄。 – Quassnoi

+0

這是隨機性密碼強?因爲如果不是這樣,我不明白這種行爲會如何有用...;) – Lucero

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這可能是相當inoptimal。

同樣通過更改ORDER BY子句,您可以選擇要返回的FolderLink如果存在多項式。

+0

不幸的是,這不起作用 - 關鍵字'CROSS'和'ORDER'附近的語法錯誤。 – ElHaix

+0

'@ ElHaix':當然,我迷惑了這些子句的順序。 – Quassnoi

1

我已經使用MIN或MAX聚合函數完成了這項工作,這似乎工作得很好,而且比我見過的大多數其他方法要簡單得多。

所以它會是這樣的:

SELECT [ColumnA], MIN(ColumnB) AS ColumnB, MIN(ColumnC) AS ColumnC 
FROM MyTable 
GROUP BY ColumnA 

在這種情況下ColumnA將是不同的列。

+0

本是在上面建議的。很棒! 謝謝! – ElHaix