选择那些具有多个条目的字段[重复]
Posted
技术标签:
【中文标题】选择那些具有多个条目的字段[重复]【英文标题】:select those fields that has more than one entry [duplicate] 【发布时间】:2013-04-13 17:37:08 【问题描述】:我不明白如何编写仅显示这些条目的简单 sql 语句 不止一次出现。
例如
NodeID Number
0 12
1 12
2 12
0 13
1 13
0 14
1 15
2 16
1 17
从表格中选择nodeID
、number
,其中数字出现不止一次且具有不同的nodeID
结果:
NodeID Number
0 12
1 12
2 12
0 13
1 13
【问题讨论】:
【参考方案1】:SELECT a.*
FROM TableName a
INNER JOIN
(
SELECT Number
FROM TableName
GROUP BY Number
HAVING COUNT(*) > 1
) b ON a.Number = b.Number
SQLFiddle Demo
另一种方法是使用EXISTS
SELECT a.*
FROM TableName a
WHERE EXISTS
(
SELECT 1
FROM TableName b
WHERE a.Number = b.Number
GROUP BY Number
HAVING COUNT(*) > 1
)
SQLFiddle Demo
【讨论】:
即使12
重复出现nodeID
sqlfiddle.com/#!2/97d68/1/0 也会选择记录。认为我误解了这个问题?
@Ejay 答案基于上面的示例。你有关于重复的观点,但如果 OP 对每个组合都有唯一约束,则可以避免这种情况。
@Ejay 这是您的解决方案示例,sqlfiddle.com/#!2/97d68/4
太好了 :) 您的解决方案确实解决了 OP 的问题。我只是对重复案例感到好奇【参考方案2】:
试试这个
SELECT NodeID , Number FROM TableName WHERE Number IN
(SELECT Number FROM TableName GROUP BY Number HAVING COUNT(*) > 1)
【讨论】:
【参考方案3】:你也可以使用EXISTS
而不使用GROUP BY
:
SELECT nodeid,
number
FROM Table1 t1
WHERE EXISTS(SELECT 1
FROM Table1 t2
WHERE t1.number = t2.number
AND t1.nodeid <> t2.nodeid)
DEMO
【讨论】:
【参考方案4】:我的第一个想法是像下面这样进行自我加入,但它不起作用,因为分组发生在之后。
SELECT T1.NodeId, T2.Number, COUNT(T2.Number) C 从表 T1 INNER JOIN 表 T2 使用(数字) 其中 C > 1 GROUP BY T2.Number
因此您必须先进行分组选择,然后进行连接:
SELECT NodeId, Number
FROM Table T1
INNER JOIN (
SELECT Number, COUNT(Number) C
FROM Table
WHERE C > 1
GROUP BY Number
) T2 USING(Number)
【讨论】:
以上是关于选择那些具有多个条目的字段[重复]的主要内容,如果未能解决你的问题,请参考以下文章