我有一个联系人表,它有唯一的接触作为主键,但可能有或可能没有相同帐户的多个记录。我的任务是返回一个与CEO的指定没有任何联系的帐户和帐户名称的列表。
我同意这应该很简单,而且我坦率地承认自己很蠢,所以我做的是用所有唯一的帐户创建一个临时表,然后标记那些确实有首席执行官职位的表,然后做一个选择不同的帐户,account_name其中的标志是null组,等等,这些都是快速而正确的,但是非常蹩脚。我经常写一些蹩脚的脚本,它们工作得很好,但却是可耻的基础,也就是因为我是这么想的。
一定有一个好的,优雅的方法来做这件事,这样我也许可以学到一些东西。有人能帮忙吗?谢谢提前为您提供帮助!(p.s.使用SS2014)
以下是2,3,5家公司没有首席执行官的抽样数据:
create table contact (
contactid int,
accountid int,
account_name varchar(10),
designation varchar(5));
insert into contact
values
(1, 100, 'COMPANY1', 'MGR'),
(2, 100, 'COMPANY1', 'MGR'),
(3, 100, 'COMPANY1', 'VP'),
(4, 100, 'COMPANY1', 'CEO'),
(5, 200, 'COMPANY2', 'COO'),
(6, 200, 'COMPANY2', 'CIO'),
(7, 200, 'COMPANY2', 'VP'),
(8, 200, 'COMPANY2', 'VP'),
(9, 300, 'COMPANY3', 'MGR'),
(10, 400, 'COMPANY4', 'MGR'),
(11, 400, 'COMPANY4', 'MGR'),
(12, 400, 'COMPANY4', 'CEO'),
(13, 500, 'COMPANY5', 'VP'),
(14, 500, 'COMPANY5', 'VP'),
(15, 500, 'COMPANY5', 'VP'),
(16, 500, 'COMPANY5', 'VP');发布于 2017-03-08 23:05:07
对于这种情况,我通常只使用一个null的自连接,如下所示:
SELECT DISTINCT
C.accountid
FROM contact C
LEFT JOIN contact CEO
ON CEO.accountid = C.accountid
AND CEO.designation = 'CEO'
WHERE
CEO.contactid IS NULL发布于 2017-03-08 22:53:16
像这样吗?
WITH CEO_IDs AS
(
SELECT DISTINCT accountID
FROM contact
WHERE designation='CEO'
)
SELECT DISTINCT accountID
FROM contact
WHERE accountid NOT IN(SELECT x.accountID FROM CEO_IDs AS x)CTE找到所有的accountID,其中确实有一个首席执行官,并使用它作为一个负过滤器来获取所有的帐户to,而这些帐户to没有首席执行官。
你会得到同样的子项选择:
SELECT DISTINCT accountID
FROM contact
WHERE accountid NOT IN
(SELECT x.accountID
FROM contact AS x
WHERE x.designation='CEO')https://stackoverflow.com/questions/42683124
复制相似问题