我需要在以下数据库中选择 * 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
。
所以我的问题是如何选择所有列包括具有相同Rua
和CP
的行,但只有一次 (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/