繁体   English   中英

MySQL:查询具有某些互斥列值的记录组

[英]MySQL: Query for group of record with certain exclusive column value

我有以下记录:

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

但这只会捕获甚至只有一个primary ='N'的所有记录。 什么是正确的SQL查询来执行此操作?

一种方法是:

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

这利用了'Y''N'之后排序的事实,因此只要该组中只有一个'Y'MAX(primary)就会为'Y'

当您创建GROUP BY ,它必须至少包含您选择的所有数据。

如果您不想像我的其他答案那样依赖排序规则,则可以使用以下方法:

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中推导出名称,地址和城市,因此最好使用单独的表来获取该信息。 如果这是因为数据如名称所示来自视图,而不是来自实际表,则可以,但是您仍然可以通过使用上面的子查询中的基础表而不是整个表来提高效率视图。

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'
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM