sql - 仅当计数匹配时才计数行
问题描述
我怎样才能实现这样的目标?
select count(distinct a.name)
from table_a as a
where (
select count(*)
from table_b as b
where b.id = a.id
) = (
select count(*)
from table_c as c
where c.id = a.id
);
仅当与第一个相关的两个不同表中的计数具有相同的 ID 计数时,我才想计算行数。假设我们使用的是 PostgreSQL。
解决方案
我试图模拟你描述的情况。
CREATE TABLE a (name VARCHAR, id INT8);
CREATE TABLE b (id INT8);
CREATE TABLE c (id INT8);
INSERT
INTO a
VALUES ('none', 1),
('equal', 2),
('more_b', 3),
('more_c', 4),
('no_b', 5),
('no_c', 6);
INSERT INTO b VALUES (2), (3), (3), (4), (6);
INSERT INTO c VALUES (2), (3), (4), (4), (5);
SELECT name
FROM (
WITH b_agg AS (
SELECT a.id,
name,
CASE
WHEN b.id IS NULL THEN 0
ELSE count(*)
END AS smart_count
FROM a LEFT JOIN b ON a.id = b.id
GROUP BY a.id, a.name, b.id
),
c_agg AS (
SELECT a.id,
name,
CASE
WHEN c.id IS NULL THEN 0
ELSE count(*)
END AS smart_count
FROM a LEFT JOIN c ON a.id = c.id
GROUP BY a.id, a.name, c.id
)
SELECT a.name,
a.id,
b_agg.smart_count AS b_count,
c_agg.smart_count AS c_count
FROM a JOIN b_agg ON a.id = b_agg.id JOIN c_agg ON a.id = c_agg.id
) AS t
WHERE b_count = c_count;
DROP TABLE a;
DROP TABLE b;
DROP TABLE c;
运行时,这会产生
name
-------
equal
none
(2 rows)
推荐阅读
- typescript - Typescript with Angular HttpClient ErrorType ...在调用类方法时不是函数
- arrays - 如何将 *big.Int 转换为 golang 中的字节数组
- android - Android Activity 是在应用程序进程中启动的,尽管它是从其他进程开始的
- python - Python - 我可以用 for 循环打印出具有连续数字的变量吗?
- vue.js - 如何使用 vuex 通过 vuejs 中的道具获取状态项
- angular - 如何在角度 4 中执行搜索功能?
- python - 抓住一个或两个单词 IF 在一个模式后大写并将结果与另一个列表匹配
- java - Spring @Value 资源注入测试和主要资源
- sql - 有没有办法将 Postgresql 的 using 与附加子句结合起来?
- javascript - PHP Javascript - 在 PHP session_destroy 上保留 localStorage