SQL-выбор строк с одинаковым значением в двух столбцах

решение этой темы ускользает от меня.

у меня есть таблица, похожая (помимо других полей, которые не имеют ничего общего с моим вопросом):

ИМЯ, НОМЕР КАРТЫ, 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

это может быть просто Отсортировано по номеру карты, чтобы сделать его полезным для людей.

каков наиболее эффективный способ сделать это?

3 ответов


поскольку вы упомянули имена могут быть дублированы, и что дубликат имени по-прежнему означает, что это другой человек и должен отображаться в результирующем наборе, нам нужно использовать группу, имея 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 )

среда SQL скрипку Пример


можно использовать 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)

каков наиболее эффективный способ сделать это?

Я считаю 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

план запроса: http://www.sqlfiddle.com/#!2/0abe3/1