কোনও তালিকা থেকে আইডি সন্ধান করুন যা কোনও টেবিলে বিদ্যমান নেই


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

@ মার্টিন প্রদত্তEXCEPT মত ব্যবহার করার সময় , নকলগুলিEXCEPTALL ভাঁজ করার চেষ্টা করার জন্য যদি আপনি কিছুটা অতিরিক্ত অর্থ দিতে না চান তবে এটি তৈরি করতে ভুলবেন না।

বিটিডাব্লু, একটি VALUESঅভিব্যক্তি নিজেই দাঁড়িয়ে থাকতে পারে:

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

তবে আপনি এইভাবে ডিফল্ট কলামের নাম পান।

একটি জন্য দীর্ঘ তালিকা মূল্যবোধের এটি আরো অ্যারে এবং unnest যেমন প্রদান সুবিধাজনক হতে পারে। সংক্ষিপ্ত বাক্য গঠন:

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
আপনি যদি কোনও সাধারণ নির্বাচন পরিচালনা করছেন এবং আপনি কেবল এই জন্য একটি সারণী তৈরি করছেন এটি সেরা সমাধান হতে পারে না।
— প্যাট্রিক ডি'অ্যাপলোনিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.