如何在SQL Server 2008中将列与where子句一起使用distinct?

Hem*_*rma 0 distinct where-clause sql-server-2008

我想获得特定列的不同值,但如果选择了3列以上,则不能正确管理duplicity.

查询是:

SELECT DISTINCT 
  ShoppingSessionId, userid 
FROM 
  dbo.tbl_ShoppingCart 
GROUP BY 
  ShoppingSessionId, userid 
HAVING
  userid = 7
Run Code Online (Sandbox Code Playgroud)

此查询产生正确的结果,但如果我们添加另一列,则结果是错误的.

请帮助我,因为我想使用ShoppingSessionIdas作为一个独特的,除非我想使用表中的所有列,包括使用该where子句.

我怎样才能做到这一点?

And*_*y M 5

DISTINCT关键字适用于整行,从不适用于列.

目前DISTINCT根本不需要,因为您的脚本已经确保它ShoppingSession是不同的:通过GROUP BY在另一个分组列中指定列并过滤(userid).

当您添加第三列GROUP BY并导致重复时ShoppingSession,这意味着某些ShoppingSession值与添加的列的许多不同值相关联.

如果要ShoppingSession在包含第三列后保持不同,则应确定应在输出中保留添加列的哪些值以及应丢弃哪些值.这称为聚合.您可以将该MAX()函数应用于该列,MIN()或任何其他合适的聚合函数.请注意,列应该包含在GROUP BY这种情况下.

以下是我所说的内容的说明:

SELECT
  ShoppingSessionId,
  userid,
  MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
GROUP BY
  ShoppingSessionId,
  userid
HAVING userid = 7
Run Code Online (Sandbox Code Playgroud)

您的查询还有一个注释.该HAVING子句通常用于对聚合列进行过滤.如果您的过滤器不涉及聚合列,则最好使用该WHERE子句:

SELECT
  ShoppingSessionId,
  userid,
  MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
WHERE userid = 7
GROUP BY
  ShoppingSessionId,
  userid
Run Code Online (Sandbox Code Playgroud)

虽然两个查询都会产生相同的结果,但它们的效率会有所不同,因为第一个查询必须拉出所有行,对它们进行分组/聚合,然后丢弃所有行userid = 7,但第二个将首先丢弃行,然后再分组/聚合剩下的,效率更高.

您可以更进一步,从userid列中排除该列GROUP BY并使用聚合函数拉取其值:

SELECT
  ShoppingSessionId,
  MAX(userid) AS userid,
  MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
WHERE userid = 7
GROUP BY
  ShoppingSessionId
Run Code Online (Sandbox Code Playgroud)

由于userid输出中的所有值都应该包含7(因为它在您的过滤器中),您可以为每个人选择一个最大值ShoppingSession,因为它知道它始终是7.