我正在寻找表格中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子句中。我在考虑可能存在或不存在,但我之前没有使用过这些条件所以我不确定它们是否有用。
这是不可能的,因为......如果令人失望的答案是可以接受的。
答案 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