SQL - 选择两列中具有相同值的行

nic*_*dnk 8 mysql sql join

该主题的解决方案正在回避我.

我有一张桌子(除了与我的问题无关的其他领域):

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)

这可以按卡号排序,使其对人类有用.

这样做最有效的方法是什么?

woo*_*oot 7

由于您提到名称可以重复,并且重复的名称仍然意味着是不同的人并且应该显示在结果集中,因此我们需要使用 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)

SQL 小提琴示例


sge*_*des 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)
Run Code Online (Sandbox Code Playgroud)


Fuz*_*ree 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
Run Code Online (Sandbox Code Playgroud)

查询计划:http://www.sqlfiddle.com/#!2/obab3/1

  • @nickdnk - 在这种情况下,这是更正确的答案.另外2个寻找不同的名称来区分重复的列.如果这是Oracle,那么ROWID或简单的主键将更适合其他答案. (2认同)