किसी तालिका में मौजूद सूची से 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सूची के विरुद्ध बाहरी जुड़ाव का उपयोग कर सकते हैं (ऊपर वर्णित मार्टिन के उत्तर के समान):

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अंतिम क्वेरी को पढ़ने में आसान बनाने के लिए आप क्लॉज़ को सीटीई में भी डाल सकते हैं:

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

@Martin कीEXCEPT तरह उपयोग करते समय , इसे बनाना याद रखें , जब तक कि आप डुप्लिकेट को मोड़ने की कोशिश के लिए थोड़ा अतिरिक्त भुगतान नहीं करना चाहते।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
यदि आप एक सरल चयन निष्पादित कर रहे हैं और आप इसके लिए एक तालिका बना रहे हैं तो यह सबसे अच्छा समाधान नहीं हो सकता है।
पैट्रिक डी'प्पोलोनियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.