Объединяйте таблицы только в том случае, если определенное значение не существует среди нескольких строк в другой таблице.

Я пытаюсь присоединиться к двум таблицам. Одна таблица заполнена полностью уникальными переменными debtor. Дубликатов идентификатора должника не может быть. Теперь я хочу объединить его с таблицей items, где идентификатор debtor.debtor может появляться несколько раз.

Что я хочу сделать, так это присоединиться только в том случае, если элемент '20004' не существует в истории заказов.

У меня есть следующая скрипта sql

http://sqlfiddle.com/#!2/a0826/1/0

create table items
 (
 debtor int,
 item int,
 qty int,
 invoice int
 );
create table debtor
 (
 debtor int,
 name varchar(255)
 );
insert into debtor(debtor, name)
VALUES ('1000','Mister blue'),
 ('1001','Mister Orange'),
 ('1002','Mister Red'),
 ('1003','Mister Yellow'),
 ('1004','Mister Green');
INSERT INTO items (debtor, item,qty, invoice)
values ('1000','20001','1','1'),
 ('1000','20002','1','1'),
 ('1000','20003','1','1'),
 ('1000','20004','1','1'),
 ('1000','20005','1','1'),

 ('1001','20001','1','2'),
 ('1001','20002','1','2'),
 ('1001','20003','1','2'),

 ('1001','20005','1','2'),

 ('1002','20001','1','3'),
 ('1002','20002','1','3'),
 ('1002','20003','1','3'),
 ('1002','20004','1','3'),
 ('1002','20005','1','3'),
 ('1002','20006','1','3'),

 ('1003','20001','1','4'),
 ('1003','20002','1','4'),
 ('1003','20003','2','4'),
 ('1003','20004','1','4'),
 ('1003','20005','1','4');

И я делаю следующий запрос:

SELECT * FROM debtor
JOIN items on debtor.debtor = items.debtor AND items.item != '20004'

Но я все еще получаю все строки счета, которые не являются '20004'.

Как я могу выполнить запрос таким образом, чтобы соединение не выполнялось, если значение '20004' не появилось?

Мой предпочтительный ответ, который должен исходить от запроса, должен состоять в том, что должен отображаться только mr Orange.

Кто может мне помочь?


person Tschallacka    schedule 22.01.2014    source источник
comment
Какие столбцы вам действительно нужны в результате?   -  person Martin Smith    schedule 22.01.2014


Ответы (4)


Попробуй это:

SELECT * FROM debtor d
JOIN items i on d.debtor = i.debtor 
WHERE NOT EXISTS 
  (SELECT debtor 
   FROM items i2
   WHERE item = '20004' AND i2.debtor = i.debtor
   )

Обновление скрипта: http://sqlfiddle.com/#!2/a0826/12/0< /а>

person Tanner    schedule 22.01.2014
comment
Спасибо, Таннер, за ответ и обновленную скрипку, это именно то, что мне нужно. Быстро и хорошо. - person Tschallacka; 22.01.2014

Или это:

select * from debtor d
join items i on d.debtor = i.debtor 
where d.debtor not in (select debtor from items where item = '20004');
person Kirill Zorin    schedule 22.01.2014
comment
Спасибо Кирилл за ответ. Я не принял ваш ответ на том основании, что ваш метод немного медленнее, чем метод, предложенный Таннером. Но спасибо за ваши усилия! - person Tschallacka; 22.01.2014

если вам нужны только счета-фактуры «200004», вы должны использовать

SELECT * FROM debtor
JOIN items on debtor.debtor = items.debtor AND items.item = '20004'

вместо этого вы использовали != ... возможно, просто опечатка ...

person PrfctByDsgn    schedule 22.01.2014
comment
Это не то, чего они хотят. Возвращает синий, красный, желтый. Они хотят оранжевый. - person Martin Smith; 22.01.2014

Вы должны основывать свой фильтр на столбце должника, потому что идентификатор 1001 — это Mister Orange.

SELECT * FROM debtor
JOIN items on debtor.debtor = items.debtor AND debtor.debtor = '1001'

http://sqlfiddle.com/#!2/a0826/19/0

person Justin Paul Paño    schedule 22.01.2014
comment
не мочь. Это переменные, какой продукт должен быть исключен, поэтому я получу разные результаты. Я не знаю заранее, какой должник мне попадется. В примере, который я предоставил, я ясно дал понять, что ожидаемый результат — г-н оранжевый, в реальном приложении Word я бы использовал сотни тысяч строк, чтобы копаться. - person Tschallacka; 22.01.2014