2012-08-22 33 views
7

Tôi có bảng thiết lập như sau:Chọn mẹ nếu tất cả trẻ em đáp ứng tiêu chí

Parent 
------ 
id, ... 

Child 
----- 
id, parent_id, x, y 

Tôi muốn tìm các bậc phụ huynh, hoặc PARENT_ID biệt (s), nếu tất cả của các hàng trong Child chứa một parent_id cho trước đáp ứng một tiêu chí liên quan đến x và y (trong trường hợp của tôi x = y).

Ví dụ:

Parent 
------ 
id 
1 
2 
3 

Child 
id, parent_id, x, y 
1,  1,  2, 3 
2,  1,  3, 4 
3,  2,  5, 5 
4,  2,  6, 7 
5,  3,  8, 8 
6,  3,  9, 9 

sẽ cho kết quả 3. Hiện nay, tôi có một truy vấn mà thấy parent_ids rằng bất kỳ của trẻ em đáp ứng được các tiêu chí. Sau đó tôi sử dụng nó để lấy những bản ghi đó và kiểm tra chúng trong mã nếu tất cả trẻ em đáp ứng các tiêu chuẩn. Với dữ liệu ví dụ, tôi nhận được parent_id 2 và 3, nhận được hai bản ghi cha mẹ với tất cả trẻ em và đánh giá. Tôi muốn làm điều này với một truy vấn duy nhất, nếu có thể.

+0

pls bạn có thể nói với sản lượng dự kiến ​​ur là gì? – AnandPhadke

+0

@AnandPhadke, sản lượng dự kiến ​​của tôi sẽ là 3. – CheeZe5

+0

Bạn đang sử dụng DBMS nào? PostgreSQL? Oracle? DB2? –

Trả lời

18

Bạn có thể sử dụng NOT EXISTS

SELECT id 
FROM Parent p 
WHERE NOT EXISTS 
(
    SELECT 1 FROM Child c 
    WHERE c.parent_Id = p.id 
    AND c.x <> c.y 
) 

Edit: Đây là sql-fiddle: http://sqlfiddle.com/#!3/20128/1/0

+9

+1 cho SQL Fiddle ... không bao giờ biết rằng tồn tại ... rất tiện dụng. – Webjedi

+0

Tôi đã có một trường hợp tương tự, tôi cần có được tất cả các bậc cha mẹ nhưng trong một chương trình cột đáp ứng các tiêu chí ở trẻ em. Tôi sử dụng một LEFT JOIN ( SELECT 1 như một p2.id TỪ Chánh p2 nơi không tồn tại ( chọn 1 từ c2 Child ĐÂU c2.parent_Id = p2.id VÀ c2.test = 'f' ) VÀ DANH SÁCH ( CHỌN 1 TỪ Đứa trẻ c2 WHERE c2.parent_Id = p2.id VÀ c2.test = 't' ) ) cOK ON cOK.id = p.id –

1

Đây là những gì bạn cần?

select id from parent where id not in(
    select parent_id from chile 
    where x<>y 
    group by parent_id) 
0

có nên tham gia 2 bảng đầu tiên bởi vì cha mẹ không có con rằng sẽ làm hài lòng

Và nên thêm chỉ số cho cột pa_id

SELECT DISTINCT pa.id 
FROM pa INNER JOIN c ON c.pa_id = pa.id 
WHERE NOT EXISTS (SELECT 1 FROM c WHERE c.parent_Id = p.id and c.x <> c.y) 
Các vấn đề liên quan