รวมตารางเฉพาะในกรณีที่ไม่มีค่าที่แน่นอนในหลายแถวในตารางอื่น

ฉันพยายามเข้าร่วมสองตาราง ตารางหนึ่งคือตารางที่เต็มไปด้วยตัวแปรที่ไม่ซ้ำกันโดยสิ้นเชิง debtor ไม่สามารถมีรหัสลูกหนี้ซ้ำกันได้ ตอนนี้ฉันต้องการเข้าร่วมกับตาราง items โดยที่ debtor.debtor id สามารถปรากฏได้หลายครั้ง

สิ่งที่ฉันต้องการทำคือเข้าร่วมเฉพาะในกรณีที่ไม่มีรายการ '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 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
ไม่สามารถ. เป็นตัวแปรที่ต้องยกเว้นผลิตภัณฑ์ใด ดังนั้นฉันจึงได้ผลลัพธ์ที่แตกต่างกัน ฉันไม่รู้ล่วงหน้าว่าฉันจะได้ลูกหนี้คนไหน ในตัวอย่างที่ฉันให้ไว้ ฉันแสดงให้เห็นชัดเจนว่าผลลัพธ์ที่คาดหวังคือ mr orange ในการใช้งานคำจริง ฉันจะใช้แถวนับแสนเพื่อขุดผ่าน - person Tschallacka; 22.01.2014