2012-11-20 23 views
5

Ví dụ nếu tôi đưa ra bảng sauLựa chọn từ một cơ sở dữ liệu dựa trên một danh sách các cặp độc đáo

Id  Key    Value 

1   A    Alpha 
2   B    Alpha 
3   A    Charlie 

Tôi lấy đầu vào {(A, Charlie) và (B, Alpha)} và tôi được yêu cầu trả lại tất cả các ID tôi muốn nó trả về 2 và 3 nhưng KHÔNG 1.

Cách tốt nhất để làm điều này là gì? Tôi có thể kết hợp tất cả vào một truy vấn, (cho tốc độ) hay tôi sẽ phải chạy truy vấn lặp lại cho mỗi cặp giá trị mà tôi nhận được.

+6

gì RDBMS bạn đang sử dụng? Các đầu vào được lưu trữ như thế nào, trong các biến hay cái gì khác? Bạn dự định gọi truy vấn như thế nào? – LittleBobbyTables

+0

Tôi hơi bối rối với RDBMS nhưng tôi đang sử dụng postgre và truy cập cơ sở dữ liệu bằng java sử dụng ngủ đông. – Landister

+0

Lưu ý, Postgres không phải là Postgre –

Trả lời

9

Tôi nghĩ PostgreSQL có giải pháp thanh lịch nhất:

SELECT * 
FROM T 
WHERE ("Key", "Value") IN (('B', 'Alpha'), ('A', 'Charlie')); 

SQL Fiddle Example

Trong SQL SERVER 2008 trở đi bạn có thể sử dụng VALUES để xây dựng bộ dữ liệu của bạn:

SELECT T.* 
FROM T 
     INNER JOIN 
     ( VALUES 
       ('B', 'Alpha'), 
       ('A', 'Charlie') 
     ) v (Key, Value) 
      ON v.Key = T.Key 
      AND v.Value = T.Value 

SQL Fiddle Example

O r cho một thủ tục bạn có thể tạo ra một loại cặp khóa-giá trị và chuyển thông tin này như một tham số:

CREATE TYPE KeyValuePair AS TABLE ([Key] VARCHAR(1), [Value] VARCHAR(7)); 

DECLARE @T AS KeyValuePair 
INSERT @T 
VALUES 
    ('B', 'Alpha'), 
    ('A', 'Charlie') 


SELECT T.* 
FROM T 
     INNER JOIN @T v 
      ON v.[Key] = T.[Key] 
      AND v.Value = T.Value; 

SQL Fiddle Example

Đối với MySQL Tôi nghĩ rằng bạn có thể phải chỉ xây dựng này sử dụng AND/OR

SELECT * 
FROM T 
WHERE (`Key` = 'A' AND `Value` = 'Charlie') 
OR  (`Key` = 'B' AND `Value` = 'Alpha') 

Example on SQL Fiddle

Kiến thức về DBMS khác của tôi bị giới hạn, vì vậy nếu không phải là một trong những điều trên xin lỗi, tôi không thể trợ giúp thêm.

EDIT (Với sự giúp đỡ của a_horse_with_no_name)

Cú pháp PostgreSQL cũng làm việc cho Oracle (và tôi nghĩ rằng DB2)

+1

Cú pháp PostgreSQL cũng hoạt động cho Oracle (và tôi nghĩ DB2) –

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