如何解决不同联合的SQL计数
我有一个查询,该查询从三个表中捕获客户ID(每个表是一种不同的联系方式)。 我想在工会之后获得不同客户ID的数量。
下面的SQL语句正在运行,并返回唯一的客户ID(无重复)的列表:
SELECT DISTINCT customer_id
FROM email_contact
WHERE info_id = 1
AND status = 'SENT'
UNION
SELECT DISTINCT customer_id
FROM call_contact
WHERE info_id = 1
AND status = 'CALLED'
UNION
SELECT DISTINCT customer_id
FROM mail_contact
WHERE info_id = 1
AND status = 'MAILED'
从该查询中,我希望获得一定数量的客户,但是我尝试将查询包装在选择数量中,这一直会产生语法错误。如何包装工会为我提供一定数量的客户?
解决方法
我建议:
SELECT COUNT(DISTINCT customer_id)
FROM (
SELECT customer_id FROM email_contact WHERE info_id = 1 AND status = 'SENT'
UNION ALL SELECT customer_id FROM call_contact WHERE info_id = 1 AND status = 'CALLED'
UNION ALL SELECT customer_id FROM mail_contact WHERE info_id = 1 AND status = 'MAILED'
) t
我删除了DISTINCT
,并将UNION
更改为UNION ALL
,所以数据库只从3个并集成员中收集了所有行,而没有尝试管理重复项(这很快)。然后,您可以在外部查询中使用COUNT(DISTINCT ...)
。
您可以像这样包装它
SELECT COUNT(*)
FROM
( SELECT DISTINCT customer_id
FROM email_contact
WHERE info_id = 1
AND status = 'SENT'
UNION
SELECT DISTINCT customer_id
FROM call_contact
WHERE info_id = 1
AND status = 'CALLED'
UNION
SELECT DISTINCT customer_id
FROM mail_contact
WHERE info_id = 1
AND status = 'MAILED') t1
,
这是你的蚂蚁吗?
SELECT COUNT(*)
FROM ((SELECT customer_id
FROM email_contact
WHERE info_id = 1 AND status = 'SENT'
) UNION -- on purpose to remove duplicates
(SELECT customer_id
FROM call_contact
WHERE info_id = 1 AND status = 'CALLED'
) UNION
(SELECT customer_id
FROM mail_contact
WHERE info_id = 1 AND status = 'MAILED'
)
) c;
请注意,您所有的DISTINCT
都是不必要的,因为UNION
会删除重复项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。