2010-11-09 75 views
1

有2个表格。 1是主表,另一个与主表有一对多的关系。具有许多关系的表格具有被用作标志的字段。所以它通常具有Y或null的值。从组中选择合格的记录

所以我想选择主表中有记录在第二个表中的行,只要第二个表上的所有行在其字段中都有一个Y.在其他病房中,如果Y字段有空值或其他值,则不符合条件。

所以逻辑是,如果所有行都有Y比,OK,如果某些行有是,有些没有Y,那么它们不会在选择中有效。

希望这是明确的。

谢谢。

回答

1

像这样的东西应该做的伎俩......

SELECT p.Field 
FROM PrimaryTable p 
WHERE NOT EXISTS(SELECT * FROM SecondaryTable s WHERE p.ID = s.ID AND (s.Flag <> 'Y' OR s.Flag IS NULL)) 

我认为无论是总会有一个给定PrimaryTable纪录SecondaryTable记录....或者,如果没有,那么你仍然想要返回主记录。

0
select p.* 
    from primary_table p 
     inner join secondary_table s 
      on p.join_key = s.join_key 
       and s.flag = 'Y' 
    where not exists(select null from secondary_table s2 where s2.join_key = p.join_key and (s2.flag is null or s2.flag <> 'Y')) 
+0

的问题说,'flag'可以是'null'或其他一些价值,但只有Y'可以申请的'值。您的语句返回主表中可以有多个'flag'值的行,只要它们不为空。 – Gingi 2010-11-09 18:17:25

+0

@Gingi:谢谢。相应调整。 – 2010-11-09 18:25:34

0
SELECT 
     p.* 
    FROM 
     PrimaryTable p, 
     (select s.ID, 
       count(*) AllRecs, 
       sum(case when S.Flag = 'Y' then 1 else 0 end) as YesRecCount 
      from 
       SecondaryTable s 
      group by 
       s.ID 
      having 
       AllRecs = YesRecCount) squalified 
    WHERE 
     p.ID = squalified.ID