2012-05-22 13 views
17

के निम्न मान लेते हैं:(एक को छोड़कर बाईं के लिए सम्मिलित हों) मक्खी पर एक इनलाइन एसक्यूएल तालिका बनाएं

तालिका A

id | value 
---------- 
1 | red 
2 | orange 
5 | yellow 
10 | green 
11 | blue 
12 | indigo 
20 | violet 

मैं आईडी के (10, 11, 12, 13 की एक सूची है , 14) जिसका उपयोग इस तालिका में आईडी को देखने के लिए किया जा सकता है। आईडी की यह सूची मेरे अग्रभाग में उत्पन्न होती है।

पूरी तरह से SQL का उपयोग करके, मुझे इस सूची (10, 11, 12, 13, 14) से आईडी का चयन करने की आवश्यकता है जिसमें तालिका ए में प्रविष्टियां नहीं हैं ('आईडी' कॉलम पर शामिल हों)। नतीजा आईडी के 13 और 14 के परिणामस्वरूप होना चाहिए।

मैं केवल एसक्यूएल का उपयोग करके इसे कैसे पूरा कर सकता हूं? (इसके अलावा, यदि संभव हो तो मैं संग्रहीत प्रक्रिया का उपयोग करने से बचना चाहता हूं)

एकमात्र दृष्टिकोण जो मैं सोच सकता हूं वह ऐसा कुछ है जो फ्लाई पर एक इनलाइन SQL तालिका बना देगा ताकि अस्थायी रूप से आईडी की मेरी सूची हो। हालांकि, मुझे नहीं पता कि यह कैसे करें। क्या यह संभव है? क्या कोई बेहतर तरीका है?

धन्यवाद! :)

+0

यह बहुत स्पष्ट नहीं है। यदि आपकी आईडी किसी अन्य तालिका में नहीं है तो इसमें शामिल होने के लिए कुछ भी नहीं है। – Cfreak

+0

बिल्कुल। :) इसमें समस्या निहित है! – rinogo

+0

'IN IN () 'में क्या गलत है? – Cfreak

उत्तर

18

आप एक UNION सबक्वेरी के साथ एक "इनलाइन तालिका" बना सकते हैं:

(
      SELECT 10 AS id 
    UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 
    -- etc. 
) AS inline_table 
+0

क्या यह एक समस्या होगी यदि मेरी सूची वास्तव में कुछ सौ आइटम लंबी है (प्रश्न के अनुसार 5 आइटम की बजाय)? – rinogo

+0

@rinogo: ठीक है, यह आपकी क्वेरी को काफी लंबा बना देगा (जिसका अर्थ यह हो सकता है कि इसे पार्स करने में कुछ समय लगता है), लेकिन मुझे किसी भी अंतर्निहित समस्याओं से अवगत नहीं है। – eggyal

+2

@rinogo: वास्तव में बड़ी सूचियों के साथ आप 'max_allowed_packet' सीमा को हिट कर सकते हैं जो आपको क्वेरी सबमिट करने की अनुमति नहीं देगा, हालांकि इसे डिफ़ॉल्ट सेटिंग्स के साथ सैकड़ों हजार रिकॉर्ड की आवश्यकता है। – Quassnoi

5
CREATE TEMPORARY TABLE ids (id INT NOT NULL PRIMARY KEY); 

INSERT 
INTO ids 
VALUES 
(10), 
(11), 
(12), 
(13), 
(14); 

SELECT * 
FROM ids 
WHERE id NOT IN 
     (
     SELECT id 
     FROM a 
     ); 
+0

लेकिन, यह समानांतर प्रश्नों के लिए काम नहीं करेगा! –

+0

@mortezakavakebi: आपका क्या मतलब है? – Quassnoi

+0

एक टेबल बनाना सत्र आधार नहीं है। जब विभिन्न उपयोगकर्ता इस क्वेरी वाले यूआरएल को कॉल करते हैं तो "आईडी" टेबल पर संघर्ष होता है। –

33

आप के बाद एक मेज मूल्य का उपयोग एसक्यूएल सर्वर 2008 से यह कर सकते हैं निर्माता।

SELECT * FROM (
    VALUES(1, 'red'), 
     (2, 'orange'), 
     (5, 'yellow'), 
     (10, 'green'), 
     (11, 'blue'), 
     (12, 'indigo'), 
     (20, 'violet')) 
    AS Colors(Id, Value) 

अधिक यहाँ जानकारी: Table Value Constructor

+5

दुर्भाग्य से यह प्रश्न 'mysql' के साथ टैग किया गया है, न कि' sql-server'। – trincot

+3

सौभाग्य से मेरे लिए मैंने अभी भी उस पर क्लिक किया और इसे पाया – Jonesopolis

संबंधित मुद्दे