2011-02-24 26 views
0

我本質上是一個表:SQL SELECT拼圖:清除患兒家長時過濾掉

name   has_children  parent_id row_id values0.....valuesn 
parent  1     1   1 
children  0     1   2 
children  0     1   3 
parent  0     4   4 
parent  1     5   5 
children  0     5   6 
children  0     5   7 

爲孩子們的值可以比父的值不同。 我想要一些選擇/連接,將過濾值列上的表(即> 10),並將返回父(即使過濾器爲假),如果其中一個孩子是真的過濾器。

acceptable return: 
parent=true all children=false, return just parent 
parent=false >=1 children=true, return parent and all non-filtered child 

我敢肯定這是以前想過但我沒有最隱祕的想法如何短語的問題找到解決方案。

+0

如果它是不可能的,但可以用一個額外的列來完成,有可能是一個方法,我可以生成該專欄,所以我很歡迎評論! – knicnak32 2011-02-24 23:12:26

+1

您使用的是什麼RDBMS? – Donnie 2011-02-24 23:14:51

+0

另外,你最後的兩個回報條件是相互矛盾的。我想像一個錯字,但我不想猜測你的意思。 – Donnie 2011-02-24 23:15:47

回答

2

符合ANSI標準。每個特定DBMS可以有更快的實現

select * 
from tbl 
where id in-- PARENTS of CHILDREN that match 
( select parent_id from tbl 
    where values0 > 10 and has_children = 0) 
or id in -- ONE CHILD ONLY 
( select MIN(id) from tbl 
    where values0 > 10 and has_children = 0 
    group by parent_id) 
or id in -- PARENTS 
( select id from tbl 
    where values0 > 10 and has_children = 1) 

更好寫成JOIN

select t.* 
from 
( select parent_id as ID from tbl 
    where values0 > 10 and has_children = 0 
    UNION 
    select MIN(id) from tbl 
    where values0 > 10 and has_children = 0 
    group by parent_id 
    UNION 
    select id from tbl 
    where values0 > 10 and has_children = 1) X 
join tbl t on X.ID = t.ID 
+0

做得好。把我所有的SQL技能理解,但很好的解決方案:) – knicnak32 2011-02-25 17:58:30

0

它可能是最簡單的處理這兩個單獨的查詢與他們之間的UNION。

  1. 選擇所有孩子在條件下爲假的父母。
  2. 選擇父母和某個孩子(MAX或MIN可能是最簡單的)。
+0

3條件實際上需要 – RichardTheKiwi 2011-02-24 23:23:56