2012-05-23 31 views
10

Tôi có một bảng gọi là người chơi như sau:Chọn Query bởi Cặp các lĩnh vực sử dụng một định tại khoản

First_Id Second_Id  Name 
1   1    Durant 
2   1    Kobe 
1   2    Lebron 
2   2    Dwight 
1   3    Dirk 

Tôi muốn viết một tuyên bố chọn trên bảng này để lấy tất cả các hàng có id và id thứ hai trận đấu đầu tiên một loạt các id đầu tiên và thứ hai được chỉ định.

Ví dụ: tôi muốn chọn tất cả các hàng có id thứ nhất và thứ hai như sau: (1,1), (1,2) và (1,3). Điều này sẽ truy xuất 3 dòng sau:

First_Id Second_Id Name 
1   1   Durant 
1   2   Lebron 
1   3   Dirk 

Có thể viết một truy vấn chọn một cách như:

SELECT * 
FROM PLAYERS 
WHERE (First_Id, Second_Id) IN ((1,1), (1,2) and (1,3))? 

Nếu có một cách để viết SQL tương tự như I nêu trên muốn biết. Có cách nào để xác định các giá trị cho một mệnh đề IN thể hiện nhiều hàng như được minh họa.

Tôi đang sử dụng DB2.

+0

Câu hỏi hay Tôi muốn giống nhau –

Trả lời

20

này hoạt động trên DB2 của tôi (phiên bản 9,7 trên Linux/Unix/Windows) bằng cách sử dụng cú pháp sau:

SELECT * 
FROM PLAYERS 
WHERE (First_Id, Second_Id) IN (VALUES (1,1), (1,2), (1,3)) 

Cú pháp này sẽ không hoạt động trên DB2 trên Mainframe (ít nhất là trong phiên bản 9.1) vì bạn không thể thay thế một lựa chọn con với một biểu thức GIÁ TRỊ. Cú pháp này sẽ hoạt động:

SELECT * 
FROM PLAYERS 
WHERE (First_Id, Second_Id) IN (SELECT 1, 1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
           SELECT 1, 2 FROM SYSIBM.SYSDUMMY1 UNION ALL 
           SELECT 1, 3 FROM SYSIBM.SYSDUMMY1) 
+0

Đây không phải là SQL chuẩn nhưng nó cung cấp giải pháp cụ thể cho cơ sở dữ liệu. –

+2

@GordonLinoff Tôi đồng ý, nhưng anh ta nói anh ta đang sử dụng DB2. :) – bhamby

+0

Cú pháp đầu tiên ('WHERE (f, s) IN (VALUES (1,1), (1,2))') cũng hoạt động trong PostgreSQL, và trong tài liệu nó nói rằng nó là loại SQL chuẩn: https : //www.postgresql.org/docs/current/static/sql-values.html – Envek

3

Với các khóa chính ghép, tôi sẽ nối hai id và ghép các chuỗi ký tự.

select id1 + id2 as FullKey, * 
from players 
where FullKey in ('11','12','13') 

(Nếu id không dây, chỉ cần quăng như vậy.)

+0

Mặc dù ghép các cột chính là một cách tiếp cận hữu ích, an toàn hơn là bao gồm một ký tự phân tách giữa các cột. Mặc dù mệnh đề ORDER BY có thể tham chiếu đến một bí danh cột như FullKey trong ví dụ này, DB2 chỉ cho phép các bí danh bảng nhưng không cho phép các bí danh cột trong mệnh đề WHERE. –

+1

Tôi hiểu. Không nhận ra rằng DB2 có một ràng buộc như vậy đối với các bí danh cột. Tuy nhiên, bằng cách sử dụng các hợp chất id1 + id2 (hoặc id1 + delim + id2, mà, bạn đang phải, là một ý tưởng tốt hơn) trong WHERE nên làm các trick. – SQLCurious

+0

Bạn cần phải thêm dấu phân cách mà bạn phải đảm bảo không nằm trong kết quả. Sẽ luôn có khả năng trùng lặp như '('ab', 'cd')' và '('abc', 'd')' cả hai nối với 'abcd' – inetphantom

0

Dưới đây là một giải pháp rất giống nhau trong postgresql:

SELECT tmp_table.val1, tmp_table.val2 
FROM tmp_table 
WHERE (tmp_table.val1, tmp_table.val2) not in (select tmp_table2.val1, tmp_table2.val2 from tmp_table2); 
+0

LƯU Ý: Đây không phải là chính xác những gì được yêu cầu , Tôi đã sử dụng các chú thích trước để giải quyết vấn đề cụ thể của tôi khi chèn hai giá trị, val1, val2 từ bảng tạm thời vào bảng thực tế, trong khi bảng thực tế này có một khóa duy nhất trên (val1, val2). Tôi đã phải tìm một cách để loại bỏ các cặp khóa trong tmp_table của tôi trước khi chèn. Đây là phần lựa chọn của mệnh đề trên chèn của tôi. –

0

Đây là loại truy vấn làm việc trong DB2.

SELECT * FROM A 
WHERE (C1, C2) IN (SELECT B1, B2 FROM B WHERE B3=1); 
Các vấn đề liên quan