2013-04-11 34 views
5

Hãy xem ví dụ Oracle SQL, mà làm việc một cách hoàn hảo:T-SQL tương đương với oracle sql mệnh đề where với nhiều cột

mẫu dữ liệu:

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 

Dưới đây là sql-fiddle: http://www.sqlfiddle.com/#!4/8375e/3/0

Câu hỏi đơn giản: có bất kỳ sự tương đương nào trong MS không SQL ở trên "ở đâu (a, b)" khoản? Tôi đã tìm kiếm trong google, MS Documents và không có gì cho đến nay ...

+0

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

+0

Nó hoạt động như thế nào trong Oracle? Nó giống như 'select * từ thử nghiệm trong đó a = 1 và b = 4;'? Vậy thì lợi ích là gì? –

+0

N.B: '(a, b)' được gọi là "biểu thức giá trị hàng" hoặc một bộ tuple. Điều này có thể giúp với googling. –

Trả lời

0

Cách truy vấn bên dưới, hỗ trợ trong máy chủ sql; và tôi đoán a=1 and b=4 cho kết quả tương tự trong SQL Server tương đương với truy vấn oracle .:

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

Đây có phải là giống như truy vấn oracle (tôi không biết)? Nó sẽ cung cấp cho một bản ghi như các câu trả lời khác nhưng nếu bạn chèn một bản ghi khác với 'a = 4, b = 1' bạn sẽ nhận được hai bản ghi thay vì một bản ghi. http://www.sqlfiddle.com/#!3/24f87/5/1 –

+0

Vâng, câu trả lời của tôi chỉ cho 1 bản ghi. Trong oracle đầu ra cũng là một bản ghi (như ông đã đề cập). – TechDo

+0

Có, truy vấn này không chính xác. Theo chuẩn SQL, '(a, b) = (1, 4)' tương đương với '(a = 1) AND (b = 4)'. Điều này giải thích cho các vị ngữ 'IN' và subselects chỉ là tốt. Vị từ của bạn tương đương với '(1 = a OR 1 = b) AND (4 = a OR 4 = b)' –

5

Trong khi SQL Server có Table Value Constructor có thể được sử dụng cho một số trường hợp sử dụng, SQL Server không hỗ trợ SQL giá trị hàng tiêu chuẩn các biểu thức và các vị từ bắt nguồn từ các biểu thức giá trị hàng để sử dụng chung (chưa). Bạn sẽ phải dùng đến bán kết subquery bạn sử dụng tương đương EXISTS khoản:

này:

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

là tương đương với này (xem 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 
) 

Hoặc, một chút tổng quát hơn, bằng cách sử dụng biểu thức bảng chung (Xem 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

Đây là [Vấn đề kết nối] (http://connect.microsoft.com/SQLServer/feedback/details/299231/add-support-for-ansi-standard-row-value-constructors) nếu bạn cảm thấy muốn thôi bỏ phiếu nó. –

+0

@Damien_The_Unbeliever: Cảm ơn bạn đã liên kết. Tôi sẽ! –

Các vấn đề liên quan