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


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.