该主题的解决方案正在回避我。
我有一张桌子(除了与我的问题无关的其他字段):
NAME,CARDNUMBER,MEMBERTYPE
现在,我想要一个显示cardnumber和membertype相同的行的视图。这两个字段都是整数。名称是VARCHAR。名称不是唯一的,并且重复的cardnumber,membertype也应显示相同的名称。
即。如果以下是表格:
JOHN | 324 | 2
PETER | 642 | 1
MARK | 324 | 2
DIANNA | 753 | 2
SPIDERMAN | 642 | 1
JAMIE FOXX | 235 | 6
我想要:
JOHN | 324 | 2
MARK | 324 | 2
PETER | 642 | 1
SPIDERMAN | 642 | 1
这可以按卡号排序,以使其对人类有用。
最有效的方法是什么?
答案 0 :(得分:7)
您可以使用exists
:
select *
from yourtable y
where exists (
select 1
from yourtable y2
where y.name <> y2.name
and y.cardnumber = y2.cardnumber
and y.membertype = y2.membertype)
答案 1 :(得分:7)
最有效的方法是什么?
我相信JOIN
会比EXISTS
SELECT t1.* FROM myTable t1
JOIN (
SELECT cardnumber, membertype
FROM myTable
GROUP BY cardnumber, membertype
HAVING COUNT(*) > 1
) t2 ON t1.cardnumber = t2.cardnumber AND t1.membertype = t2.membertype
答案 2 :(得分:3)
由于您提到名称可以重复,并且重复的名称仍然意味着不同的人并且应该显示在结果集中,我们需要使用GROUP BY HAVING COUNT(*)&gt; 1为了真正发现欺骗。然后将其连接回主表以获取完整的结果列表。
此外,从您的评论中,听起来您将其包装到视图中,您需要将子查询分开。
CREATE VIEW DUP_CARDS
AS
SELECT CARDNUMBER, MEMBERTYPE
FROM mytable t2
GROUP BY CARDNUMBER, MEMBERTYPE
HAVING COUNT(*) > 1
CREATE VIEW DUP_ROWS
AS
SELECT t1.*
FROM mytable AS t1
INNER JOIN DUP_CARDS AS DUP
ON (T1.CARDNUMBER = DUP.CARDNUMBER AND T1.MEMBERTYPE = DUP.MEMBERTYPE )
答案 3 :(得分:0)
如果您只需要了解3个非唯一字段的值对,则只需执行以下操作:
SELECT concat(NAME, "|", CARDNUMBER, "|", MEMBERTYPE) AS myIdentifier,
COUNT(*) AS count
FROM myTable
GROUP BY myIdentifier
HAVING count > 1
这将为您提供NAME
,CARDNUMBER
和MEMBERTYPE
的所有不同对,这些计数不止一次地使用一次(计数重复多少次)。这不会给您返回条目,您必须在第二步中完成该操作。