Немного размыто при получении DISTINCT для одного столбца? - PullRequest
1 голос
/ 09 октября 2009

Я видел несколько разных версий этого вопроса, но с трудом применил его к тому, что мне нужно ...

Запрос 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. Использование отличного не будет работать как отличное действие для всей строки.

Помощь будет оценена.

Спасибо!

Ответы [ 5 ]

2 голосов
/ 09 октября 2009

Если вы хотите, чтобы все столбцы результатов в исходном запросе и каждый 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 голос
/ 09 октября 2009

Я сделал это с помощью агрегатных функций MIN или MAX, которые, кажется, работают довольно хорошо, и написать их гораздо проще, чем большинство других методов, которые я видел.

Так что это будет примерно так:

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

В этом случае столбец A будет отдельным столбцом.

1 голос
/ 09 октября 2009

Запрашиваемая для одной из множества строк с одинаковым квитанцией является неоднозначным. Как вы хотите выбрать этот ряд из других?

0 голосов
/ 09 октября 2009
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 вы хотите вернуть, если есть muptiple.

0 голосов
/ 09 октября 2009

DISTINCT отличается для всего ряда. Попробуйте GROUP BY ReceiptID, конечно, значения для других столбцов могут не иметь смысла, потому что он просто выберет одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...