Я хотел переписать SQL-оператор, который использует NOT IN, чтобы присоединиться - PullRequest
0 голосов
/ 27 августа 2018

Table1

id   name  new_location  old_location
1    adb   fgh           ghj
2    cde   ghj           yth
3    fas   dcq           tm1
4    fas1  tm1           hgy

Таблица 2

id     name   new_location  
1      adb    fgh         
2      cde    ghj
3      fas    dcq      
4      fas1   tm1

старое местоположение для нескольких человек - новое местоположение для какого-то человека

select t1.* 
from #table1 t1 
where t1.old_location not in (select t2. new_location from table2 )


id   name  new_location  old_location
2    cde   ghj           yth
4    fas1  tm1           hgy

Как переписать, используя join? пожалуйста помогите

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

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

Гораздо разумнее добавить все свои результаты во временную таблицу, а затем удалить из нее с помощью объединения. Я бы написал оба метода, а затем оценил, какой из них быстрее. На небольшом количестве рядов влияние практически отсутствует. В зависимости от ваших данных, это может быть большая разница. Также проверьте планы выполнения обоих.

Заставить его работать - только 10% проблемы, остальное - заставить его работать быстро.

0 голосов
/ 27 августа 2018

Если вы хотите использовать JOIN, просто используйте JOIN и задайте условие t1.old_location = t2.new_location из in подзапроса.

select t1.* 
from table1 t1 
INNER JOIN  table2 t2 ON  t1.old_location = t2.new_location  

EDIT

но из вашего ожидаемого результата ваш sql, похоже, должен использовать NOT IN вместо in, если вы хотите от NOT IN до JOIN

вы можете попробовать использовать OUTER JOIN, затем получить t2.new_location IS NULL, что означает, что значение не соответствует table1

create table Table1(
   id int,
   name varchar(50),
   new_location varchar(50),
   old_location varchar(50)
);


insert into Table1 values (1,'adb','fgh','ghj');
insert into Table1 values (2,'cde','ghj','yth');
insert into Table1 values (3,'fas','dcq','tm1');
insert into Table1 values (4,'fas1','tm1','hgy');


create table Table2(
   id int,
   name varchar(50),
   new_location varchar(50)
);


insert into Table2 values (1,'adb','fgh');         
insert into Table2 values (2,'cde','ghj');
insert into Table2 values (3,'fas','dcq');      
insert into Table2 values (4,'fas1','tm1');

Запрос 1 :

SELECT  t1.*
FROM    table1 t1
LEFT JOIN
        table2 t2
ON  t1.old_location = t2.new_location  
WHERE   t2.new_location  IS NULL

Результаты

| id | name | new_location | old_location |
|----|------|--------------|--------------|
|  2 |  cde |          ghj |          yth |
|  4 | fas1 |          tm1 |          hgy |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...