2012-08-02 45 views
0

我有以下记载:的MySQL:查询与某些专属列值的记录的组

name       acct_num address  city  rep  primary 
DARTMOUTH HITCHCOCK HOSPITAL 1212 MEDICAL CENTER DR LEBANON P Meehan Y 
DARTMOUTH HITCHCOCK HOSPITAL 1212 MEDICAL CENTER DR LEBANON P Johnson N 

MASSACHUSETTS GENERAL HOSPITAL 891 PO BOX 123 CHARLESTOWN P Morrison N 
MASSACHUSETTS GENERAL HOSPITAL 891 PO BOX 123 CHARLESTOWN P McCoy  N 
MASSACHUSETTS GENERAL HOSPITAL 891 PO BOX 123 CHARLESTOWN P Lorena N 

CLINIC PHARMACY CONTROL SUPPLY 282043 1 MEDICAL CENTER DR LEBANON P Sikes N 
CLINIC PHARMACY CONTROL SUPPLY 282043 1 MEDICAL CENTER DR LEBANON P Kang Y 
CLINIC PHARMACY CONTROL SUPPLY 282043 1 MEDICAL CENTER DR LEBANON P Tolbert N 

基本上我需要查询不具有主接触(所有的主=“N”)中的任医院。因此,在上述记录中,我需要得到麻省总医院,因为所有记录都是primary ='N'。

我想:

SELECT * FROM `account_prof_affiliation_view` where primary_sf='N' GROUP BY accnt_num 

但是,这也只是捕捉到了甚至只是一个初级=“N”的所有记录。什么是正确的SQL查询来做到这一点?

+0

小提琴实验可在http://sqlfiddle.com/#!2/433e0/4 – MvG 2012-08-02 21:55:13

回答

1

一条路可走会是这样:

SELECT name, accnt_num 
FROM account_prof_affiliation_view 
GROUP BY accnt_num, name 
HAVING MAX(primary) = 'N' 

这使得使用的事实,'Y'各种'N'后,所以MAX(primary)'Y'每当有该组中的一个'Y'

+0

工作和快速,因为我有超过80K的记录。我很感激帮助。 – ibaralf 2012-08-02 22:29:06

1

当您制作GROUP BY时,它必须包含您选择的所有最小数据。

0
select * from account_prof_affiliation_view a 
where not exists (
    select `primary` from account_prof_affiliation_view b 
    where b.id=a.id 
    and b.primary = 'Y' 
) 
+0

这给我所有的记录。也许我做错了。 – ibaralf 2012-08-02 22:28:24

1

如果你不想靠整理,顺便my other answer的话,那么你可以使用这个:你的数据库模式似乎是违反了second normal form

SELECT accts.account_num 
FROM (SELECT DISTINCT account_num FROM account_prof_affiliation_view) accts 
    LEFT JOIN account_prof_affiliation_view aff 
      ON (aff.primary_sf = 'Y' AND aff.account_num = accts.account_num) 
WHERE aff.account_num IS NULL 

注意:姓名,地址和城市可能最有可能从account_num中推断出来,因此为此信息提供单独的表格将是更可取的。如果这是因为数据来自视图(如名称所示),而不是来自实际表格,则这是正常的,但通过在上面的子查询中使用基础表,而不是整体,您仍然可以使事情更有效视图。