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