table1 (id, name)
table2 (id, name)
ค้นหา:
SELECT name
FROM table2
-- that are not in table1 already
table1 (id, name)
table2 (id, name)
ค้นหา:
SELECT name
FROM table2
-- that are not in table1 already
คำตอบ:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
ถาม : เกิดอะไรขึ้นที่นี่
ตอบ : ตามหลักการแล้วเราเลือกแถวทั้งหมดจากtable1
และสำหรับแต่ละแถวที่เราพยายามค้นหาแถวtable2
ด้วยค่าเดียวกันสำหรับname
คอลัมน์ หากไม่มีแถวดังกล่าวเราเพียงปล่อยtable2
ส่วนของผลลัพธ์ว่างไว้สำหรับแถวนั้น จากนั้นเรา จำกัด การเลือกของเราโดยเลือกเฉพาะแถวเหล่านั้นในผลลัพธ์ที่ไม่มีแถวที่ตรงกัน สุดท้ายเราไม่สนใจฟิลด์ทั้งหมดจากผลลัพธ์ของเรายกเว้นname
คอลัมน์ (อันที่เรามั่นใจว่ามีอยู่table1
)
แม้ว่ามันอาจจะไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุดเท่าที่จะเป็นไปได้ในทุกกรณี แต่ก็ควรใช้งานได้กับทุกเอนจิ้นฐานข้อมูลที่เคยใช้ANSI 92 SQL
คุณสามารถทำได้
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
หรือ
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
ดูคำถามนี้สำหรับ 3 เทคนิคเพื่อทำสิ่งนี้
ฉันไม่มีคะแนนตัวแทนมากพอที่จะโหวตคำตอบที่ 2 แต่ฉันต้องไม่เห็นด้วยกับความคิดเห็นในคำตอบที่ดีที่สุด คำตอบที่สอง:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
FAR มีประสิทธิภาพมากขึ้นในทางปฏิบัติ ฉันไม่รู้ว่าทำไม แต่ฉันใช้กับบันทึก 800k + และความแตกต่างเป็นอย่างมากกับประโยชน์ที่ได้จากคำตอบที่ 2 ที่โพสต์ข้างต้น แค่ $ 0.02 ของฉัน
นี่คือทฤษฎีเซตบริสุทธิ์ที่คุณสามารถทำได้ด้วยการminus
ดำเนินการ
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
ระวังข้อผิดพลาด หากฟิลด์Name
ในTable1
Null มีคุณอยู่ในความประหลาดใจ ดีกว่าคือ:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
นี่คือสิ่งที่ดีที่สุดสำหรับฉัน
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
นี่เร็วกว่าสองเท่าเหมือนกับวิธีอื่นที่ฉันลอง
คุณสามารถใช้EXCEPT
ใน mssql หรือMINUS
oracle พวกมันเหมือนกันตาม:
นั่นทำงานได้ดีสำหรับฉัน
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
ดูข้อความค้นหา:
SELECT * FROM Table1 WHERE
id NOT IN (SELECT
e.id
FROM
Table1 e
INNER JOIN
Table2 s ON e.id = s.id);
แนวคิดจะเป็น: การดึงระเบียนที่ตรงกันในแบบสอบถามย่อยแล้วในแบบสอบถามหลักดึงข้อมูลระเบียนที่ไม่ได้อยู่ในแบบสอบถามย่อย
ฉันจะโพสต์ใหม่ (เนื่องจากฉันยังไม่เจ๋งพอที่จะแสดงความคิดเห็น) ในคำตอบที่ถูกต้อง .... ในกรณีที่คนอื่นคิดว่ามันจำเป็นต้องอธิบายให้ดีกว่า
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
และฉันเคยเห็นซินแท็กซ์ใน FROM ซึ่งจำเป็นต้องใช้เครื่องหมายจุลภาคระหว่างชื่อตารางใน mySQL แต่ใน sqlLite ดูเหมือนว่าจะชอบพื้นที่มากกว่า
บรรทัดล่างคือเมื่อคุณใช้ชื่อตัวแปรที่ไม่ดีที่มันทิ้งคำถาม ตัวแปรของฉันควรมีเหตุผลมากกว่านี้ และบางคนควรอธิบายว่าทำไมเราจึงต้องใช้เครื่องหมายจุลภาคหรือไม่มีเครื่องหมายจุลภาค
หากคุณต้องการเลือกเฉพาะผู้ใช้
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
tent_npk
เป็นคีย์หลักของผู้ใช้