2010-02-12 16 views
5

मैंने हाल ही में किसी को एसओ क्वेरी प्रश्न के उत्तर के हिस्से के रूप में पोस्ट किया है:क्या आप क्वेरी में नहीं के लिए एकाधिक कॉलम का उपयोग कर सकते हैं?

SELECT DISTINCT a, b, c 
FROM t1 
WHERE (a,b,c) NOT IN 
    (SELECT DISTINCT a,b,c FROM t2) 

मैं थोड़ा उलझन में हूं, क्योंकि मैंने हमेशा सोचा था कि आप "इन नहीं" के लिए एकाधिक कॉलम का उपयोग नहीं कर सकते हैं (" जहां (ए, बी, सी)", आदि)। क्या यह सही एसक्यूएल वाक्यविन्यास है? और MySQL के बारे में कैसे?

उत्तर

3

यह एक एसक्यूएल विस्तार है। ओरेकल, पोस्टग्रेएसक्यूएल और माईएसक्यूएल में यह है। एसक्यूएल सर्वर 2005 में यह नहीं है। मैं दूसरों के बारे में निश्चित नहीं हूँ।

+0

ओरेकल में भी है। –

0

ऐसा नहीं है कि मैं के बारे में पता कर रहा हूँ, लेकिन अगर thy're चरित्र प्रकार (या प्रकार चार करने के लिए परिवर्तित किया जा सकता है), तो आप नकली यह कर सकते हैं:

SELECT DISTINCT a, b, c 
FROM t1 
WHERE a+b+c NOT IN 
    (SELECT DISTINCT a+b+c FROM t2) 
+0

इसमें इसमें एक बग है। एक = 'ab' b = 'cd' c = 'ef' एक = 'abcd' b = 'e' c = 'f' से मेल खाता है ... –

+0

आपको यह सुनिश्चित करने के लिए सावधान रहना होगा कि आप ' कॉलम सामग्री के आधार पर टकराव नहीं मिलता है। मैं विभाजक में डाल दूंगा ताकि कॉलम गलती से सकारात्मक रूप से न हो जाएं: 'ए' + 'बीबी' + 'सी' == 'अब' + 'बी' + 'सी' – tvanfosson

+0

काम नहीं करेगा विशेष स्ट्रिंग से हालांकि ... ए + बी एक = "ab" के लिए "abc" और b = "सी", या एक = "एक" और ख = "ई.पू." हो सकता है। – Corey

0

इस

SELECT DISTINCT a, b, c 
FROM t1, 
(SELECT DISTINCT a,b,c FROM t2) as tt 
WHERE t1.a NOT IN tt.a 
AND t1.b NOT IN tt.b 
AND t1.c NOT IN tt.c 

नोट का प्रयास करें: यह परीक्षण नहीं किया गया है, तो यह और भी सही नहीं साबित हो चुका है।

+0

मेरा सवाल यह नहीं है कि यह कैसे करें - मुझे कुछ तरीकों से पता है। मैं बस चाहता था पता है कि सिंटैक्स सही था, क्योंकि किसी ने इसे पोस्ट किया था और कोई भी ऑब्जेक्ट नहीं किया था। – froadie

+0

@froadie क्षमा करें, मेरी गलतफहमी। अन्य लोगों ने आपके प्रश्न का सही जवाब दिया है। –

1

यह निश्चित रूप से Oracle में काम करता है। त्वरित काल्पनिक उदाहरण:

SQL> select ename, job, deptno from emp 
    2 where (ename, deptno) in 
    3 (select ename, deptno from emp 
    4 where job = 'MANAGER' 
    5 ); 

ENAME  JOB   DEPTNO 
---------- --------- ---------- 
JONES  MANAGER   20 
CLARK  MANAGER   10 
PARAG  MANAGER   30 

यह भी काम करता है:

SQL> select ename, job, deptno from emp 
    2 where (ename, deptno) in (('JONES',20),('CLARK',10)); 

ENAME  JOB   DEPTNO 
---------- --------- ---------- 
JONES  MANAGER   20 
CLARK  MANAGER   10 

नहीं भी:

SQL> select ename, job, deptno from emp 
    2 where (ename, deptno) not in 
    3 (select ename, deptno from emp 
    4 where job = 'MANAGER' 
    5 ); 

ENAME  JOB   DEPTNO 
---------- --------- ---------- 
SMITH  CLEANER   99 
SCOTT  ANALYST   20 
KING  PRESIDENT   10 
FORD  ANALYST   20 
MILLER  CLERK    10 
+0

वह 'इन नहीं' के बारे में पूछ रहा है। न केवल 'IN' –

+0

@ डेविड वनिल - क्या आप यह नहीं मान सकते कि अगर कोई काम करता है, तो दूसरा क्या है? – froadie

+0

उदाहरण के लिए यह सुनिश्चित नहीं किया गया है ! –

2

Googling यह पता चलता है कि यह कुछ डेटाबेस नहीं बल्कि दूसरों पर काम करेंगे। इसके बजाय आप इस का उपयोग कर सकते हैं:

SELECT DISTINCT a, b, c 
FROM t1 
WHERE NOT EXISTS 
    (SELECT 1 FROM t2 
    WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) 
0

दूसरों को पहले से ही सवाल का जवाब दे दिया है, लेकिन एक प्रदर्शन सुझाव के रूप में, यदि आप किसी भी महत्वपूर्ण आकार के डेटा के साथ काम कर रहे हैं हमेशा नहीं बल्कि बयान मौजूद है की तुलना में उपयोग करें। यह लगभग हर मामले में तेजी से होगा।

http://decipherinfosys.wordpress.com/2007/01/21/32/

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

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