2012-08-22 17 views
7

tengo mesas dispuestas de este modo:Seleccionar padre si todos los niños cumplan con los criterios

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

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

Quiero encontrar a los padres, o el parent_id (s) distinta, si todo de las filas de niños, que contienen un parent_id determinado cumple un criterio que incluye xey (en mi caso x = y).

Por ejemplo:

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 

daría lugar a 3. Actualmente, tengo una consulta que encuentra parent_ids que cualquier de los niños cumplan los criterios. Luego lo uso para recuperar esos registros y verificarlos en el código si todos los niños cumplen con los criterios. Con los datos de ejemplo, obtengo parent_id 2 y 3, obtengo los dos registros principales con todos los hijos y los evalúo. Quiero hacer esto con una sola consulta, si es posible.

+0

puede Plstell lo que es ur resultado esperado? – AnandPhadke

+0

@AnandPhadke, mi salida esperada sería 3. – CheeZe5

+0

¿Qué DBMS estás usando? PostgreSQL? ¿Oráculo? DB2? –

Respuesta

18

Puede utilizar 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 
) 

Editar: Aquí está el sql-violín: http://sqlfiddle.com/#!3/20128/1/0

+9

+1 para SQL Fiddle ... nunca supo que existía ... muy útil. – Webjedi

+0

Tuve un caso similar, necesitaba obtener todos los padres, pero en un programa de columna que cumplen los criterios en niños. Utilizo un LEFT JOIN ( seleccione 1 como, p2.id de padres p2 DONDE NO EXISTE ( SELECT 1 DE c2 Child DONDE c2.parent_Id = p2.id Y c2-Test = 'f' ) Y EXISTS ( SELECT 1 FROM Child c2 WHERE c2.parent_ID = p2.id AND c2.test = 't' ) ) COK ON cOK.id = p.id –

1

Esto es lo que necesita?

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

debe unirse a 2 mesas en primer lugar porque los padres no tienen hijos que satisfarán

y debe aportar un índice para la columna 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) 
Cuestiones relacionadas