0

我有以下记录:

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')。因此,在上述记录中,我需要获得 MASSACHUSETTS GENERAL HOSPITAL,因为所有记录都是 primary='N'。

我试过:

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

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

4

4 回答 4

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'

于 2012-08-02T21:34:07.810 回答
1

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

于 2012-08-02T21:34:24.083 回答
1

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

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 中推导出来,因此最好为该信息提供一个单独的表。如果这是因为数据来自视图,如名称所示,而不是来自实际表,那​​么这没关系,但您仍然可以通过使用上面子查询中的基础表而不是整个表来提高效率看法。

于 2012-08-02T21:42:46.053 回答
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'
)
于 2012-08-02T21:34:44.750 回答