2012-04-03 28 views
5

Có cách nào để viết một truy vấn đơn lẻ để kiểm tra xem một tập hợp các hàng có khớp với tập hợp các giá trị không? Tôi có một hàng cho mỗi tập hợp các giá trị mà tôi cần phải khớp và tôi muốn biết liệu tất cả các hàng có khớp nhau hay không. Tôi có thể thực hiện điều này thông qua nhiều truy vấn như:Kiểm tra xem nhiều bản ghi có khớp với tập hợp các giá trị

select * from tableName where (value1, value2) = ('someValue1', 'someValue2') 
select * from tableName where (value1, value2) = ('someOtherValue1', 'someOtherValue2') 

... v.v ..., tùy theo số lượng truy vấn tùy ý. Làm thế nào có thể loại điều này được viết lại như một truy vấn duy nhất mà truy vấn trả về CHỈ nếu tất cả các giá trị được khớp?

+0

Hmm, nhưng cách 'giá trị1' khớp' someValue1' và cũng 'someOtherValue1'? –

Trả lời

2

Bạn có thể thử một cái gì đó như:

select t.* 
from tableName t 
join (select 'someValue1' value1, 'someValue2' value2 union all 
     select 'someOtherValue1', 'someOtherValue2') v 
    on t.value1 = v.value1 and t.value2 = v.value2 
where 2= 
(select count(distinct concat(v1.value1, v1.value2)) 
from (select 'someValue1' value1, 'someValue2' value2 union all 
     select 'someOtherValue1', 'someOtherValue2') v1 
join tableName t1 
    on t1.value1 = v1.value1 and t1.value2 = v1.value2) 

Nếu bạn có một số lượng lớn các cặp giá trị mà bạn muốn kiểm tra, nó có thể được dễ dàng hơn để chèn chúng vào một bảng tạm thời và sử dụng bảng tạm thời trong truy vấn trên, thay vì hai bảng ảo được mã hóa riêng biệt.

+1

Công cụ tuyệt vời - được đánh giá cao! – Josh

+0

@ Mark Bannister, tôi không hiểu việc sử dụng concat, và có vẻ như bạn đã bỏ lỡ một dấu ngoặc đơn đóng cửa sau đó. Bạn có thể giải thích câu trả lời này không? – Raffaele

+0

@Raffaele: Tôi đã cập nhật câu trả lời - Tôi hy vọng nó rõ ràng hơn một chút. –

2

gì về:

SELECT * 
FROM tableName 
WHERE value1 IN ('someValue1', 'someOtherValue1') AND 
     value2 IN ('someValue2', 'someOtherValue2') 
+0

Tôi đã làm rõ câu hỏi của mình nhiều hơn một chút - trong ví dụ đó tôi đang mong đợi hai hàng vì tôi có hai bộ giá trị mà tôi cần phải khớp. Tôi tin rằng truy vấn bạn đề xuất sẽ chỉ được thỏa mãn bởi một hàng vì nó sử dụng mệnh đề IN. – Josh

+0

@Josh Tôi không hoàn toàn hiểu bạn, bạn có thể đăng một ví dụ không? –

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