ค้นหา ID จากรายการที่ไม่มีอยู่ในตาราง


19

ว่าฉันมีคีมาและข้อมูลต่อไปนี้:

create table images(
  id int not null
);

insert into images values(1), (2), (3), (4), (6), (8);

ฉันต้องการที่จะทำการค้นหาเช่น:

select id from images where id not exists in(4, 5, 6);

แต่มันไม่ได้ผล กรณีข้างต้นควรกลับมา5เนื่องจากไม่มีอยู่ในระเบียนในตาราง

คำตอบ:


23

คุณสามารถใช้การรวมภายนอกกับvaluesรายการ (คล้ายกับคำตอบของ Martin ที่กล่าวถึงข้างต้น):

select t.id
from (
  values (4),(5),(6) 
) as t(id)
  left join images i on i.id = t.id
where i.id is null;

หรือnot existsร่วมกับตัวสร้างแถว:

select *
from ( 
   values (4),(5),(6)
) as v(id)
where not exists (select *
                  from images i
                  where i.id = v.id);

หากคุณชอบคุณสามารถใส่valuesอนุประโยคไว้ใน CTE เพื่อให้การสืบค้นขั้นสุดท้ายง่ายขึ้น:

with v (id) as (
 values (4),(5),(6)
)
select v.id
from v
  left join images i on i.id = v.id
where i.id is null;

10

วิธีหนึ่งในการทำเช่นนั้นคือการใช้VALUESเพื่อสร้างนิพจน์ตารางด้วยรหัสเพื่อตรวจสอบและEXCEPTค้นหานิพจน์ที่หายไป

SELECT id
FROM (VALUES(4),(5),(6)) V(id)
EXCEPT
SELECT id 
FROM images;

6

ในขณะที่ใช้งานEXCEPTเช่น@Martin ที่ให้ไว้อย่าลืมทำEXCEPTALLยกเว้นว่าคุณต้องการจ่ายเพิ่มเล็กน้อยสำหรับการพยายามทำสำเนาซ้ำ

BTW VALUESนิพจน์สามารถยืนได้ด้วยตัวของมันเอง:

VALUES (4),(5),(6)
EXCEPT ALL
SELECT id FROM images;

แต่คุณจะได้รับชื่อคอลัมน์เริ่มต้นด้วยวิธีนี้

สำหรับรายการค่าแบบยาวอาจสะดวกกว่าในการจัดให้เป็นอาร์เรย์และไม่ถูกที่สุด ไวยากรณ์ที่สั้นกว่า:

SELECT * FROM unnest('{4,5,6}'::int[]) id
EXCEPT ALL
SELECT id FROM images;

มีเทคนิคพื้นฐานสองสามอย่างสำหรับงาน:


0

เพียงใช้ตารางที่สองและเข้าร่วม

create table images1(
  id int not null
);

create table images2(
  id int not null
);

insert into images1 values(1), (2), (3), (4), (6), (8);

insert into images2 values (4), (5), (6);

SELECT i2.ID

FROM images2 i2

LEFT JOIN images1 i1
    ON i1.ID = i2.ID

WHERE i1.ID IS NULL

3
หากคุณกำลังดำเนินการเลือกอย่างง่ายและคุณกำลังสร้างตารางเพียงแค่นี้อาจไม่ใช่ทางออกที่ดีที่สุด
Patrick D'appollonio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.