2011-07-27 17 views
16

No estoy familiarizado con SQL, así que esperaba que alguien me pudiera ayudar con una consulta que encontraría todos los registros en una tabla primaria para la que no hay registros en un niño mesa.Necesita SQL Query para encontrar registros principales sin registros secundarios

Los siguientes obras para mí encontrar registros primarios de valores de campo niño en particular ...

`SELECT ParentTable.ParentID 
FROM  ParentTable INNER JOIN 
      ParentTable ON ParentTable.ParentID = ChildTable.ChildID 
WHERE  (ChildTable.ChildField_ = '2131') 
Group By 
    ParentTable.ParentID 
Having 
    count(distinct ChildTable.ChildField) > 0` 

¿Puedo cambiar la cláusula where algunos cómo encontrar los padres del con un recuento de registros secundarios cero.

Gracias.

+1

¿No acabas de cambiar '>' con '=' en la cláusula 'HAVING'? – zerkms

+0

usuario278859 si está aplicando unión interna simple no dará el ID de padre deseado hasta donde clouse (antes de que se ejecute group by) ... entonces o tiene que usar no existir o unirse a la izquierda o derecha como lo sugiere phil ... @zerkms: - entonces no obtendrá ningún registro después de aplicar el signo '=' allí –

Respuesta

52

Puede utilizar una cláusula NOT EXISTS para este

SELECT ParentTable.ParentID 
FROM ParentTable 
WHERE NOT EXISTS (
    SELECT 1 FROM ChildTable 
    WHERE ChildTable.ParentID = ParentTable.ParentID 
) 

También está el viejo dejaron unirse y comprobar nulo acercamiento

SELECT ParentTable.ParentID 
FROM ParentTable 
LEFT JOIN ChildTable 
    ON ParentTable.ParentID = ChildTable.ParentID 
WHERE ChildTable.ChildID IS NULL 

Probar ambos y mira cuál funciona mejor para ti.

+0

El primero funcionó muy bien. ¡Gracias! – user278859

+0

¡Ambos funcionan para mí, gracias! – Gaucho

3

Unión externa padres a hijos, y luego tener recuento (*) = 0.

select 
    p.parent_id, 
    count(*) 
from 
    parent p left outer join child c on p.parent_id = c.parent_id 
group by 
    p.parent_id 
having 
    count(*) = 0 
+0

en cuestión necesita registro para el padre que no tiene hijo ... así que no ha cambiado la consulta a 'p.parent_id = c.parent_id *' .. en Oracle el mismo tipo de trabajo tiene que ser hecho por '(+)' y debe agregarse en la tabla hija (en este caso) –

+0

Sí, la unión externa de padre a hijo seguirá devolviendo a los padres aun cuando no haya hijos - count (*) será 0. – rkaregaran

+0

Tiene razón -;) Tengo algunos malos hábitos ansi-92 ... – rkaregaran

Cuestiones relacionadas