Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск дублей  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
Допустим есть таблица COMP с полями COMP_ID, COMP_NAME, COMP_STAT
И необходимо выбрать все компании с COMP_STAT = 3 и найти пересечения этого пула по названию (COMP_NAME), со всей таблицей (само собой включая COMP_STAT = 3). На выходе должны быть поля COMP_ID, COMP_NAME, COMP_STAT всех пересекающихся компаний.

У меня получилось решить данную задачу только с троекратным вложением:
 
SELECT C1.COMP_NAME, C1.COMP_ID
 FROM COMP_CLEAN_NAME C1
 LEFT JOIN COMP_STAT on (COMP_STAT.COMP_ID = C1.COMP_ID
 										and COMP_STAT.EVENT_TYPES_ID = 3)
 WHERE C1.NAME_CLEAN in
    (
    SELECT DISTINCT COMP_CLEAN_NAME.NAME_CLEAN    
    FROM COMP_CLEAN_NAME
    INNER JOIN 
       (
        SELECT C.NAME_CLEAN as [NAME], C.COMP_ID  
        FROM CRM.dbo.COMP_STAT CS
        INNER JOIN COMP_CLEAN_NAME C on (C.COMP_ID = CS.COMP_ID)
        WHERE CS.EVENT_TYPES_ID = 3
       ) T on (T.[NAME] = COMP_CLEAN_NAME.NAME_CLEAN and T.COMP_ID <> COMP_CLEAN_NAME.COMP_ID) 
    )

Может есть более изящный вариант?
16 янв 14, 12:24    [15423975]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
Чуть поясню как делал я:
1. Выбираю необходимый мне пул компаний
2. Сравниваю его по названию со всей таблицей, но с учетом, что ID не пересекаются, иначе выдаст компании из пула как задвоенные. Формирую пул задвоенных названий.
3. Выбираю из базы все названия которые совпали с пулом №2.
16 янв 14, 12:27    [15423998]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
На верхний LEFT JOIN не обращайте внимания, он для других целей, забыл удалить.
16 янв 14, 12:29    [15424025]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Аноним2
Guest
intersect
16 янв 14, 12:36    [15424079]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Николай Н.
Member

Откуда:
Сообщений: 80
Аноним2, думаю для данной задачи не очень подходит.
16 янв 14, 13:24    [15424437]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
select
 c.COMP_ID, c.COMP_NAME, c.COMP_STAT
from
 COMP c
where
 exists(select 1 from COMP where COMP_NAME = c.COMP_NAME and COMP_STAT = 3);

with x as
(
 select COMP_NAME from COMP where COMP_STAT = 3
)
select
 c.COMP_ID, c.COMP_NAME, c.COMP_STAT
from
 x join
 COMP c on c.COMP_NAME = x.COMP_NAME;
16 янв 14, 13:34    [15424523]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить