SQL server 2016仅限于where语句时获得不同的结果

时间:2018-06-04 14:00:03

标签: sql sql-server distinct

我正在寻找表格中CUSTOMER_NAME字段的明确列表。通常我只会做

SELECT 

      distinct 
         [CUSTOMER_NAME]

  FROM [iData3].[dbo].[N241650]

SELECT 

         [CUSTOMER_NAME]

  FROM [iData3].[dbo].[N241650]

Group by [CUSTOMER_NAME]

但我的查询有限。由于软件限制,查询只能是

形式
SELECT * from 
[iData3].[dbo].[N241650] 
where ...

在给定这些限制的情况下,如何获得明确的客户名单?我基本上需要将所有内容塞入WHERE子句中。我在考虑可能存在或不存在,但我之前没有使用过这些条件所以我不确定它们是否有用。

这是不可能的,因为......如果令人失望的答案是可以接受的。

4 个答案:

答案 0 :(得分:1)

您可以使用row_number()功能:

SELECT TOP (1) WITH TIES [CUSTOMER_NAME]
FROM [iData3].[dbo].[N241650]
ORDER BY ROW_NUMBER() OVER (PARTITION BY CUSTOMER_NAME ORDER BY ?)

?表示您拥有的身份主要/唯一列。

答案 1 :(得分:0)

每一行都需要一些独特的东西。如果你有,你可以使用:

SELECT CUSTOMER_NAME
FROM [iData3].[dbo].[N241650]
WHERE pk = (SELECT MIN(n2.pk)
            FROM [iData3].[dbo].[N241650] n2
            WHERE n2.CUSTOMER_NAME = N241650.N241650
           );

pk是唯一的专栏。

答案 2 :(得分:0)

您可以按该列分组以获得相同的结果。

select CUSTOMER_NAME 
from ...
group by CUSTOMER_NAME
order by CUSTOMER_NAME;

另一种方法是使用存储过程。

答案 3 :(得分:0)

如果您无法逃离*,那么您就不能GROUP BY如果您只有WHERE,那么您将需要一个密钥(唯一)一组列),以便能够正确过滤,否则您无法区分重复项(并最终选择具有相同客户名称的多于一行)。

这有点令人费解,但试试这个。它会为每个CUSTOMER_NAME提供1行。

SELECT 
    * 
from 
    [iData3].[dbo].[N241650] 
where 
    [N241650].KeyColumn IN
    (
        SELECT
            Z.KeyColumn
        FROM
            (
                SELECT
                    X.KeyColumn,
                    Ranking = ROW_NUMBER() OVER (PARTITION BY X.CUSTOMER_NAME ORDER BY X.KeyColumn ASC)
                FROM
                    [iData3].[dbo].[N241650] AS X
                WHERE
                    X.KeyColumn IS NOT NULL
            ) AS Z
        WHERE
            Z.Ranking = 1
    )

ORDER BY中的OVER将确定您为每个CUSTOMER_NAME获得哪一行。

如果您的密钥有多个列,那么您必须针对多个列切换IN的{​​{1}}(您不能执行多列EXISTS在SQL Server中。)

IN