यह एक ऐसी समस्या है जो बहुत आम है:एक टेबल बनाए बिना मक्खी पर संबंध बनाना। इस समस्या के लिए SQL समाधान बहुत अजीब हैं। व्युत्पन्न तालिका का उपयोग करने वाला एक उदाहरण:
SELECT n.id
FROM
(SELECT 2 AS id
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
UNION SELECT 6
UNION SELECT 7) AS n
LEFT OUTER JOIN foos USING (id)
WHERE foos.id IS NULL;
लेकिन यह बहुत अच्छा पैमाना नहीं है, क्योंकि आपके पास केवल छह के बजाय कई मान हो सकते हैं। एक UNION
. के साथ एक लंबी सूची बनाना थकाऊ हो सकता है प्रति मूल्य की आवश्यकता है।
एक अन्य उपाय यह है कि दस अंकों की एक सामान्य-उद्देश्य तालिका को हाथ में रखा जाए, और इसे कई उद्देश्यों के लिए बार-बार उपयोग किया जाए।
CREATE TABLE num (i int);
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
SELECT n.id
FROM
(SELECT n1.i + n10.i*10 AS id
FROM num AS n1 CROSS JOIN num AS n10
WHERE n1.i + n10.i*10 IN (2, 3, 4, 5, 6, 7)) AS n
LEFT OUTER JOIN foos USING (id)
WHERE foos.id IS NULL;
मैं 0..99 से मान उत्पन्न करने वाली आंतरिक क्वेरी दिखाता हूं, भले ही यह इस मामले के लिए आवश्यक नहीं है। लेकिन आपकी सूची में आपके मान 10 से अधिक हो सकते हैं। मुद्दा यह है कि एक टेबल के साथ num
, आप एक UNION
. के साथ बहुत लंबी श्रृंखलाओं का सहारा लिए बिना बड़ी संख्या में उत्पन्न कर सकते हैं प्रति मूल्य। साथ ही, आप वांछित मानों की सूची एक ही स्थान पर निर्दिष्ट कर सकते हैं, जो अधिक सुविधाजनक और पठनीय है।