2013-04-11 5 views
5

ist zum Beispiel Oracle SQL aussehen lassen, die perfekt funktioniert:T-SQL-äquivalent zu Oracle SQL where-Klausel mit mehreren Spalten

Daten Beispiel:

SQL> create table test (a number, b number); 
SQL> insert into test values(1, 1); 
SQL> insert into test values(1, 2); 
SQL> insert into test values(1, 3); 
SQL> insert into test values(1, 4); 
SQL> insert into test values(1, 5); 
SQL> insert into test values(2, 1); 
SQL> insert into test values(2, 2); 
SQL> insert into test values(2, 3); 
SQL> insert into test values(2, 4); 
SQL> insert into test values(2, 5); 
SQL> insert into test values(4, 1); 

SQL> select * from test; 

     A   B 
---------- ---------- 
     1   1 
     1   2 
     1   3 
     1   4 
     1   5 
     2   1 
     2   2 
     2   3 
     2   4 
     2   5 
     4   1 

Abfrage:

SQL> select * from test where (a, b) in (select 1, 4 from dual); 

     A   B 
---------- ---------- 
     1   4 

Hier die sql-fiddle: http://www.sqlfiddle.com/#!4/8375e/3/0

Einfache Frage: gibt es eine Entsprechung in MS SQL von oben "wo (a, b)" -Klausel? Ich habe in Google, MS Docs und nichts so weit geschaut ...

+0

http://stackoverflow.com/questions/4452539/sql-server-in-clause-with-multiple-fields – Habib

+0

Wie funktioniert es in Oracle? Ist es dasselbe wie 'select * from test wo a = 1 und b = 4;'? Was ist der Vorteil? –

+0

N.B: '(a, b)' ist ein "Zeilenwertausdruck" oder ein Tupel. Dies könnte beim googeln helfen. –

Antwort

0

Wie über Abfrage unten, die in SQL Server unterstützt; und ich denke, a=1 and b=4 das gleiche Ergebnis in SQL Server äquivalent gibt Oracle Abfrage .:

select 
    * 
from 
    test 
where 
    a=1 and 
    b=4; 
+1

Ist das die gleiche wie die Oracle-Abfrage (ich weiß es nicht)? Es gibt einen Datensatz als die anderen Antworten, aber wenn Sie einen anderen mit 'a = 4, b = 1 'einfügen, erhalten Sie zwei Datensätze anstelle von einem. http://www.sqlfiddle.com/#!3/24f87/5/1 –

+0

Ja, meine Antwort gibt nur 1 Rekord. In Orakel ist auch die Ausgabe ein Datensatz (wie er erwähnt). – TechDo

+0

Ja, diese Abfrage ist nicht korrekt. Nach dem SQL-Standard ist "(a, b) = (1, 4)" äquivalent zu "(a = 1) AND (b = 4)". Dies erklärt das Prädikat "IN" und subselektiert dasselbe. Ihr Prädikat ist äquivalent zu '(1 = a OR 1 = b) UND (4 = a OR 4 = b)' –

5

Während SQL Server hat ein Table Value Constructor, die für einige Anwendungsfälle verwendet werden kann, SQL Server nicht SQL-Standard Zeilenwert nicht unterstützt Ausdrücke und Prädikate, die aus Zeilenwertausdrücken abgeleitet sind, für die allgemeine Verwendung (noch). Sie werden Ihre Unterabfrage semi-Beitritt unter Verwendung einer äquivalenten EXISTS Klausel zurückgreifen:

Dieses:

select * from test where (a, b) in (select 1, 4 from dual); 

auf dies entspricht (siehe SQLFiddle demo):

select * from test where exists (
    select * from (
    select 1, 4 -- Replace with "real" subselect 
) t(a, b) 
    where test.a = t.a and test.b = t.b 
) 

Oder ein bisschen allgemeiner, indem ein allgemeiner Tabellenausdruck verwendet wird (siehe SQLFiddle demo):

with t(a, b) as (
    select 1, 4 -- Replace with "real" subselect 
) 
select * from test where exists (
    select * from t 
    where test.a = t.a and test.b = t.b 
) 
+0

Hier ist das [Connect-Problem] (http://connect.microsoft.com/SQLServer/feedback/details/299231/add-support-for-ansi-standard-row-value-constructors), wenn Sie das Bedürfnis haben, abzustimmen es. –

+0

@Damien_The_Unbeliever: Danke für den Link. Ich werde! –

Verwandte Themen