gpt4 book ai didi

sql-server - 从不同的两列中选择所有列

转载 作者:行者123 更新时间:2023-12-04 12:48:54 24 4
gpt4 key购买 nike

我需要在以下数据库中选择 * where distinct 'Rua' with different 'CP':

id      Rua                  Local           Conc       CP
81143 dos moinhos Rio Tinto Gondomar 0123
81142 dos Moinhos Rio Tinto Gondomar 4435
81141 dos Moinhos Rio Tinto Gondomar 4435

通过以下查询,我可以获得两列:

SELECT Rua, CP 
FROM Codigo
GROUP BY Rua, CP
HAVING COUNT(*) = 1

但我想要所有的列。 SELECT * 返回 “列 'Codigo.id' 在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。”

所以我想到了这个答案:How do I (or can I) SELECT DISTINCT on multiple columns?

我没有选择接受的答案,因为我需要快速查询(这将用于 AJAX 搜索建议)。我使用了另一个高度赞成的答案。因此,我创建了以下查询:

SELECT * From Codigo
WHERE (Rua,CP) IN (
SELECT Rua, CP
FROM Codigo
GROUP BY Rua, CP
HAVING COUNT(*) = 1
);

返回在预期条件的上下文中指定的非 bool 类型的表达式,接近“,”错误。为什么它期望 WHERE 之后的 Rua 是 bool 值?在答案中,他们使用了看起来不是 bool 值的 saleprice

所以我的问题是如何选择所有包括具有相同RuaCP的行,但只有一次 (DISTINCT)?

最佳答案

SQL Server 不支持 (a,b) in (val1,val2) 语法

使用EXISTS检查对

SELECT *
FROM Codigo C1
WHERE EXISTS (SELECT 1
FROM Codigo C2
WHERE C1.Rua = C2.Rua
AND C1.CP = C2.CP
HAVING Count(*) = 1);

或使用COUNT() Over()窗口聚合函数统计每个Rua, CP组合的记录,过滤出计数为的组1 为每个不同的 CP 找到一个 Rua 行。

SELECT *
FROM (SELECT *,
Count(1)OVER(partition BY Rua, CP) AS cnt
FROM Codigo C1) A
WHERE cnt = 1

这将是我的首选方法,因为它比使用 EXISTS 更有效,优化器只需扫描/查找表一次

如果您不想重复记录,请使用 ROW_NUMBER()

SELECT *
FROM (SELECT *,
Row_Number()OVER(partition BY Rua, CP Order by id) AS RN
FROM Codigo C1) A
WHERE RN = 1

我已经使用 Id 列对重复记录进行了排序,并从重复项中选择了第一条记录。

关于sql-server - 从不同的两列中选择所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41649838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com