2013-11-06 2 views
0

У меня есть 2 стола Customer и meter.Поиск дубликатов в колонке

A customer может быть несколько meternbr в meter таблица. Customer имеет столбец customernbr.

Я хочу вернуть клиентов, у которых более одного meternbr. Посмотрите на таблицу ниже. Я хочу вернуть только клиентов a и c с помощью meternbr.

Customer Meter 
-------- ----- 
a   a-100 
b   a-101 
c   b-103 
d   c-104 
      c-105 
+2

Итак, у вас есть две таблицы колонок? Все еще не слишком ясно. – Andrew

+2

Показать схему таблиц и пометить свой вопрос с помощью RDMS, которую вы используете –

ответ

0

Использование GROUP BY и HAVING Статья с COUNT(*) > 1.

Вот рабочий образец: http://sqlfiddle.com/#!3/d1b91/17

код Оклейка и результаты ниже также:

Создание таблиц (Примечание: не размещали FK Constaint для демонстрационных целей)

CREATE TABLE Customer 
(
    customernbr NVARCHAR(20) NOT NULL 
) 


CREATE TABLE Meter 
(
    meternbr NVARCHAR(20) NOT NULL, 
    customernbr NVARCHAR(20) NOT NULL 
) 

ВСТАВКУ ДАННЫЕ. (Раскомментируйте последние 2 ЗЕЬЕСТ, если вы хотите увидеть данные)

INSERT INTO Customer VALUES 
('a'), 
('b'), 
('c'), 
('d'); 

INSERT INTO Meter VALUES 
('a-100','a'), 
('a-101','a'), 
('b-103','b'), 
('c-104','c'), 
('c-105','c'), 
('d-106','d'); 

--SELECT * FROM Customer; 

--SELECT * FROM Meter; 

RUN ВЫБОР ЗАЯВЛЕНИЕ

SELECT 
    customernbr AS 'Customer', 
    meternbr AS 'Meter' 
FROM Meter WHERE customernbr IN 
(
    SELECT customernbr 
    FROM Meter 
    GROUP BY customernbr 
    HAVING COUNT(*) > 1 
) 

СМОТРИТЕ РЕЗУЛЬТАТЫ :)

CUSTOMER METER 
a   a-100 
a   a-101 
c   c-104 
c   c-105 
2

Если это единственная строка (с которой я не думаю, что это хорошая идея), и если ваша СУБД поддерживает LEFT/SUBSTRING and INSTR вы можете сделать LEFT or a SUBSTRING в сочетании с INSTR, который находит, где это первый '-' индекс и получить клиентов, которые имеют более одного вхождения с помощью GROUP BY и HAVING COUNT (*)> 1.

SELECT LEFT(meterColumn,INSTR(meterColumn,'-')-1) 
FROM meter 
WHERE LEFT(meterColumn,INSTR(meterColumn,'-')-1) IN (
    SELECT LEFT(meterColumn,INSTR(meterColumn,'-')-1) 
    FROM meter 
    GROUP BY LEFT(meterColumn,INSTR(meterColumn,'-')-1) 
    HAVING COUNT(*) > 1 
    ) 
GROUP BY 1; 

Если те, (customerNbr) и (meterNbr), вы можете просто:

SELECT customerNbr 
FROM meter 
GROUP BY 1 
HAVING COUNT(*) > 1; 
Смежные вопросы