การระบุว่าค่าใดไม่ตรงกับแถวของตาราง


10

ฉันต้องการให้สามารถตรวจสอบได้อย่างง่ายดายว่าตัวระบุที่ไม่ซ้ำกันอยู่ในตารางของผู้ที่ระบุในแบบสอบถาม

เพื่ออธิบายให้ดียิ่งขึ้นนี่คือสิ่งที่ฉันต้องทำตอนนี้เพื่อตรวจสอบ ID ของรายการ "1, 2, 3, 4" ที่ไม่มีอยู่ในตาราง:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')สมมติว่าตารางไม่มีแถวที่มี ID 2
  2. ดัมพ์ผลลัพธ์ลงใน Excel
  3. เรียกใช้ VLOOKUP ในรายการต้นฉบับที่ค้นหาแต่ละค่าของรายการในรายการผลลัพธ์
  4. VLOOKUP ใด ๆ ที่ส่งผลให้#N/Aมีค่าที่ไม่ได้เกิดขึ้นในตาราง

ฉันคิดว่าต้องมีวิธีที่ดีกว่าในการทำสิ่งนี้ ฉันกำลังมองหาสิ่งที่ต้องการ

รายการที่จะตรวจสอบ -> แบบสอบถามบนตารางเพื่อตรวจสอบ -> สมาชิกของรายการที่ไม่ได้อยู่ในตาราง


โปรดอย่าทำให้เราเดาเวอร์ชั่นของ SQL Server หรือ
แอรอนเบอร์ทรานด์ด์


ขอโทษ. [แก้ไข] มันเก่า ปัญหาของ NOT IN คือมันจะคืนค่าทุกอย่างในตาราง ...
NReilingh

คำตอบ:


14

ใช้EXCEPT:

SELECT * FROM
  (values (1),(2),(3),(4)) as T(ID)
EXCEPT
SELECT ID 
FROM [TABLE];

ดูSqlFiddle


ตัวvaluesสร้างจะทำงานบน SQL Server 2008 หรือใหม่กว่าเท่านั้น สำหรับปี 2005 ใช้

SELECT 'value'
UNION SELECT 'value'

ตามรายละเอียดในคำตอบ SOนี้


อ๊ะควรระบุไว้ เกิดอะไรขึ้นถ้า ID เป็น varchar?
NReilingh

1
@NReilingh จากนั้นออกแบบ DB ใหม่ของคุณ :) แต่มันควรจะทำงานเหมือนกันฉันคิดว่า
JNK

ฉันIncorrect syntax near the keyword 'values'.วิ่งต่อไปSELECT * FROM (values ('search string'),('other string')) as T(ID)
เรื่อย ๆ

ไวยากรณ์ของคุณใช้งานได้ดีสำหรับฉันใน SQL Server 2008r2 - ฉันได้ใส่ความคิดเห็นของคุณในและมันก็วิ่ง
JNK

ฉันปี 2005 คริสต์
NReilingh

6

ฉันจะสร้างตัวแปรตารางหรือตาราง temp ที่มี ID ที่คุณกำลังค้นหา ... จากนั้นใช้โซลูชันของ Remus ลบน้ำตาล syntactic 2008:

declare @t table (ID int)
insert into @t values (1)
insert into @t values (2)
insert into @t values (3)
insert into @t values (4)
insert into @t values (5)

select ID from @t
except
select ID
from [Table];

3

ตอนนี้ฉันฉลาดขึ้นสองสามปี (และมี SQL Server รุ่นใหม่กว่า) เมื่อฉันถามคำถามนี้ดังนั้นเพื่อเฉลิมฉลองตราคำถามที่มีชื่อเสียงที่ฉันได้รับเพื่อขอสิ่งนี้นี่คือสิ่งที่ฉันจะทำตอนนี้ (ฉันไม่คิดว่าฉันเคยใช้EXCEPTโอเปอเรเตอร์มาก่อน)

ฉันจะบอกว่าLEFT JOINวิธีการด้านล่างนี้มีประโยชน์มากกว่าที่EXCEPTคุณสามารถเขียนร่วมกับการรวมอื่น ๆ โดยไม่ต้องใช้ CTE

SELECT v.val
  FROM (VALUES (1), (2), (3), (4), (5)) v (val)
    LEFT JOIN dbo.SomeTable t
      ON t.id = v.val
  WHERE t.id IS NULL;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.