该主题的解决方案正在回避我.
我有一张桌子(除了与我的问题无关的其他领域):
NAME,CARDNUMBER,MEMBERTYPE
现在,我想要一个显示cardnumber和membertype相同的行的视图.这两个字段都是整数.名称是VARCHAR.名称不是唯一的,并且重复的卡号,membertype也应该显示相同的名称.
即如果以下是表格:
JOHN | 324 | 2
PETER | 642 | 1
MARK | 324 | 2
DIANNA | 753 | 2
SPIDERMAN | 642 | 1
JAMIE FOXX | 235 | 6
Run Code Online (Sandbox Code Playgroud)
我想要:
JOHN | 324 | 2
MARK | 324 | 2
PETER | 642 | 1
SPIDERMAN | 642 | 1
Run Code Online (Sandbox Code Playgroud)
这可以按卡号排序,使其对人类有用.
这样做最有效的方法是什么?
由于您提到名称可以重复,并且重复的名称仍然意味着是不同的人并且应该显示在结果集中,因此我们需要使用 GROUP BY HAVING COUNT(*) > 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 )
Run Code Online (Sandbox Code Playgroud)
你可以使用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)
Run Code Online (Sandbox Code Playgroud)
这样做最有效的方法是什么?
我相信一个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
Run Code Online (Sandbox Code Playgroud)
查询计划:http://www.sqlfiddle.com/#!2/obab3/1