2010-08-24 55 views
4

當前,我有一個查詢返回父數據的父數據,該數據的子數據表記錄的子集等於某些值。但是,我想縮小它的範圍,只返回具有特定值的子項的父記錄,但是那些是屬於給定父項的唯一子項記錄或子項記錄數不超過給定總數的子記錄。返回具有等於特定值的子記錄的父記錄,並且給定父項的子記錄的總集合等於特定值

下面是一個例子查詢,只有讓我半路上,我需要爲:

SELECT parent.item1, parent.item2, parent.index 
FROM parent 
INNER JOIN child on parent.index = child.index 
WHERE child.value IN (11111111, 33333333) 
GROUP BY parent.item1, parent.item2, parent.index 
HAVING COUNT(child.value) = 2 

不幸的是這個查詢返回具有標識值的子集包含在「IN」的聲明任何父的數據。我只希望家長記錄的父數據的總記錄數不超過特定數字(或者,在我的情況下,不要超過「IN」語句中的數值數量。是否有一種簡單的方法可以實現這一點?

回答

5

查詢,你自找的是:

SELECT parent.item1, parent.item2, parent.index 
FROM parent 
INNER JOIN 
     child 
ON  child.index = parent.index 
GROUP BY 
     parent.item1, parent.item2, parent.index 
HAVING SUM(CASE WHEN child.value IN (1111111, 2222222) THEN 1 ELSE 0 END) = 2 
     AND COUNT(*) <= 2 

如果你只是想確保兒童匹配所有的值在IN列表,沒有不在列表中,使用(在SQL Server

SELECT * 
FROM parent p 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM (
       SELECT value 
       FROM child c 
       WHERE c.index = p.index 
       ) c 
     FULL JOIN 
       (
       SELECT 11111111 AS value 
       UNION ALL 
       SELECT 22222222 
       ) q 
     ON  c.value = q.value 
     WHERE c.value IS NULL OR q.value IS NULL 
     ) 
+0

哇......快速反應 - thx!在這種情況下,父母的肩膀d只有2個孩子記錄。但是,使用此解決方案,我仍然從包含3個子記錄(具有子集,而不是具有標識值的子記錄集)獲取父數據。 – Don 2010-08-24 13:36:05

+0

@Don:在最初的回覆中,「4」只是一個「特定數字」來限制孩子(「3」與此匹配)。現在試試。 – Quassnoi 2010-08-24 13:39:55

+0

我發現第一個解決方案與HAVING子句一起編碼如下:HAVING SUM(CASE WHEN child.value IN(11111111,33333333)THEN 1 ELSE 0 END)= 2 AND COUNT(*)= 2 - 有超過2個子記錄 – Don 2010-08-24 13:40:03

相關問題