Sql server 在一列上有点模糊?

Sql server 在一列上有点模糊?,sql-server,distinct,row,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 FolderL

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

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上获得不同的值。使用distinct不会像对整行使用distinct一样工作

我们将不胜感激


谢谢

请求具有相同receiptID的多行中的一行是不明确的。您想如何从其他行中选择该行?

要求从多行中选择具有相同receiptID的行是不明确的。您想如何从其他行中选择该行?

对于整行来说,DISTINCT是不同的。请尝试按ReceiptID分组,当然,其他列的值可能没有意义,因为它只会选择一行。

对于整行来说,DISTINCT是不同的。请尝试按ReceiptID分组,当然其他列的值可能没有意义,因为它只会选择一行。

如果希望原始查询中的所有结果列,并且希望每个ReceiptID只显示一次,则需要使用GROUP BY

比如:


如果希望原始查询中的所有结果列,并且希望每个ReceiptID只显示一次,则需要使用GROUP BY

比如:

这将消除对
groupby
DISTINCT
的需要,这可能非常不合适

另外,通过更改
ORDER by
子句,您可以选择在存在多个选项时要返回的
FolderLink

这将消除对
groupby
DISTINCT
的需要,这可能非常不合适


另外,通过更改
ORDER by
子句,您可以选择在有多个选项的情况下要返回的
FolderLink

我已经使用最小或最大聚合函数完成了这项操作,它似乎工作得很好,并且比我见过的大多数其他方法编写起来要简单得多

所以应该是这样的:

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

在本例中,ColumnA将是不同的列。

我使用了MIN或MAX聚合函数,它似乎工作得很好,并且比我见过的大多数其他方法编写起来要简单得多

所以应该是这样的:

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

在这种情况下,列A将是不同的列。

对于每个ReceiptID,您将混合几个UserCardID值,您想要哪个UserCardID值,因为这将告诉我们如何组合行。对于每个ReceiptID,您将混合几个UserCardID值,您想要哪个UserCardID值,因为这将告诉我们如何组合行我知道的所有DBMS都会失败。所有选定的列都必须是聚合函数或列在group by子句中。
@Ben S
:在MySQL中不会失败,它只会从组中选择任意记录。这种随机性在加密方面强吗?因为如果不是这样,我看不出这种行为有什么用处……;)
@Lucero
:如果在联接表中按
主键
分组,则按其他列分组以返回它们是没有意义的:它们保证是相同的。这将在我知道的所有DBMS上失败。所有选定的列都必须是聚合函数或列在group by子句中。
@Ben S
:在MySQL中不会失败,它只会从组中选择任意记录。这种随机性在加密方面强吗?因为如果不是这样,我看不出这种行为有什么用处……;)
@Lucero
:如果在联接表中按
主键进行分组,则按其他列分组返回它们是没有意义的:它们保证是相同的。不幸的是,这不起作用-关键字“CROSS”和“ORDER”附近的语法不正确。
@ElHaix
:当然,我混淆了子句的顺序。这,不幸的是,没有起作用-关键字“CROSS”和“ORDER”附近的语法不正确。
@ElHaix
:当然,我混淆了子句的顺序。这就是Ben在上面所建议的。很好!谢谢大家!以上就是本的建议。很好!谢谢大家!
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
SELECT [ColumnA], MIN(ColumnB) AS ColumnB, MIN(ColumnC) AS ColumnC 
FROM MyTable 
GROUP BY ColumnA