2013-04-11 9 views
5

Guardiamo ad esempio Oracle SQL, che funziona perfettamente: i datiT-SQL equivalente a Oracle SQL clausola where con più colonne

Esempio:

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 

Query:

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

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

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

Domanda semplice: c'è qualche equivalente in MS SQL di sopra "dove (a, b)" clausola? Mi sono guardato intorno su google, MS Docs e nulla fino a questo momento ...

+0

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

+0

Come funziona in Oracle? È lo stesso di 'select * dal test dove a = 1 eb = 4;'? Qual è il vantaggio allora? –

+0

N.B: '(a, b)' è chiamato "espressione del valore di riga" o una tupla. Questo potrebbe aiutare con googling. –

risposta

0

Come su query di sotto, che supporta in SQL Server; e credo che a=1 and b=4 dà lo stesso risultato in assistente equivalente SQL per query di Oracle .:

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

È uguale alla query dell'oracolo (non so)? Fornirà un record come le altre risposte, ma se ne inserisci un altro con 'a = 4, b = 1' otterrai due record invece di uno. http://www.sqlfiddle.com/#!3/24f87/5/1 –

+0

Sì, la mia risposta fornisce solo 1 record. In oracle anche l'output è un record (come ha menzionato). – TechDo

+0

Sì, questa query non è corretta. Secondo lo standard SQL, '(a, b) = (1, 4)' è equivalente a '(a = 1) AND (b = 4)'. Questo spiega anche il predicato e le sottosezioni 'IN'. Il tuo predicato è equivalente a '(1 = a OR 1 = b) AND (4 = a OR 4 = b)' –

5

Mentre SQL Server ha un Table Value Constructor che può essere utilizzato per alcuni casi d'uso, SQL Server non supporta valore di riga standard SQL espressioni e predicati derivati ​​da espressioni di valore di riga per uso generale (ancora). Si dovrà ricorrere a semi-parte della vostra sottoquery utilizzando un equivalente EXISTS clausola:

questo:

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

è equivalente a questo (vedi 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 
) 

Oppure, un po ' più genericamente, usando un'espressione di tabella comune (vedi 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

Ecco il [problema di connessione] (http://connect.microsoft.com/SQLServer/feedback/details/299231/add-support-for-ansi-standard-row-value-constructors) se senti la voglia di votare esso. –

+0

@Damien_The_Unbeliever: Grazie per il link. Lo farò! –

Problemi correlati