Given a parent table \'parent\'
╔═══════════╦══════════╗
║ PARENT_ID ║ NAME ║
╠═══════════╬══════════╣
║ 1 ║ bob ║
║ 2 ║ carol ║
name your first table a, and second table b
SELECT parent_id FROM prop b1
WHERE prop_id=1 and
EXISTS (SELECT parent_id FROM prop b2
WHERE b2.parent_id=b1.parent_id AND b2.prop_id=5)
I just saw this solution to a different question that seems to fit this case:
SELECT distinct parent_id
FROM rel as T1
INNER JOIN rel as T2
ON T1.parent_id = T2.parent_id
WHERE T1.prop_id = '1' and T2.prop_id = '5'
This is called Relational Division
SELECT a.name
FROM parent a
INNER JOIN rel b
ON a.parent_ID = b.parent_ID
WHERE b.prop_id IN (1,5)
GROUP BY a.name
HAVING COUNT(*) = 2
UPDATE 1
if unique constraint was not enforce on prop_id for every parent_id, DISTINCT is needed on this case.
SELECT a.name
FROM parent a
INNER JOIN rel b
ON a.parent_ID = b.parent_ID
WHERE b.prop_id IN (1,5)
GROUP BY a.name
HAVING COUNT(DISTINCT b.prop_id) = 2
I've written your table in to a CTE, let me know if you require assistance in adapting the code for your purposes.
;WITH MyTable AS
(
SELECT parent_id = 1
,prop_id = 5 UNION ALL
SELECT 1,1 UNION ALL
SELECT 2,5 UNION ALL
SELECT 2,4 UNION ALL
SELECT 2,1 UNION ALL
SELECT 3,1 UNION ALL
SELECT 3,3
)
,Eval AS
(
SELECT parent_id
,PropEval = SUM(CASE WHEN prop_id IN (1,5) THEN 1 ELSE 0 END)
FROM MyTable
GROUP BY parent_id
)
SELECT parent_id
FROM Eval
WHERE PropEval = 2