Let\'s say I have two tables, \"Parent\" and \"Child\". Parent-to-Child is a many:many relationship, implemented through a standard cross-referencing table.
I want to fi
Here's an answer.
SQL query: Simulating an "AND" over several rows instead of sub-querying
And here's a specific application of that to this problem.
SELECT * FROM Parents
WHERE ParentId in
(
SELECT ParentId FROM ChildParent
WHERE ChildId in
(
SELECT ChildId FROM Child
WHERE ChildName in ('Charlie', 'David')
)
GROUP BY ParentId
HAVING COUNT(*) = 2
)
Relying on a numerical trick (where the number of parent-child links = the number of children, that parent is linked to all children):
SELECT Parent.ParentID, COUNT(*)
FROM Parent
INNER JOIN ChildParent
ON ChildParent.ParentID = Parent.ParentID
INNER JOIN Child
ON ChildParent.ChildID = Child.ChildID
WHERE <ChildFilterCriteria>
GROUP BY Parent.ParentID
HAVING COUNT(*) = (
SELECT COUNT(Child.ChildID)
FROM Child WHERE <ChildFilterCriteria>
)
( I guess where you said "Child Eve references Eve" you meant "Child Eve references Bob", right?)
I think I've got it... looks ugly... the secret is the double negation... that is, everyone for which it's true,, is the same as not anyone for which is false... (ok, I have troubles with my english, but I guess you understand what I mean)
select * from parent parent_id name --------------------------------------- -------------------------------------------------- 1 alice 2 bob select * from child child_id name --------------------------------------- -------------------------------------------------- 1 charlie 2 david 3 eve select * from parent_child parent_id child_id --------------------------------------- --------------------------------------- 1 1 2 1 1 2 2 3 select * from parent p where not exists( select * from child c where c.child_id in ( 1, 2, 3 ) and not exists( select * from parent_child pc where pc.child_id = c.child_id and pc.parent_id = p.parent_id ) ) --when child list = ( 1 ) parent_id name --------------------------------------- -------------------------------------------------- 1 alice 2 bob --when child list = ( 1, 2 ) parent_id name --------------------------------------- -------------------------------------------------- 1 alice --when child list = ( 1, 2, 3 ) parent_id name --------------------------------------- --------------------------------------------------
well, I hope it helps...