[英]How to use subquery in position X in SELECT X FROM … with SQLAlchemy?
给定数据库中的下表
CREATE TABLE users (
id SERIAL NOT NULL,
name VARCHAR,
PRIMARY KEY (id)
)
CREATE TABLE phones (
id SERIAL NOT NULL,
user_id INTEGER,
phone VARCHAR,
PRIMARY KEY (id),
FOREIGN KEY(user_id) REFERENCES users (id)
)
CREATE TABLE emails (
id SERIAL NOT NULL,
user_id INTEGER,
email VARCHAR,
PRIMARY KEY (id),
FOREIGN KEY(user_id) REFERENCES users (id)
)
我想知道每个用户有多少电子邮件和电话号码。
并且以下查询有效:
SELECT
users.id AS id,
users.name AS name,
(
SELECT COUNT(*)
FROM emails WHERE emails.user_id = users.id
) AS email_count,
(
SELECT COUNT(*)
FROM phones WHERE phones.user_id = users.id
) AS phone_count
FROM users;
但是当SQLAlchemy生成这样的查询时:
SELECT
users.id,
users.name,
email_count.count_1,
phone_count.count_2
FROM
users,
(
SELECT count(*) AS count_1
FROM emails, users
WHERE emails.user_id = users.id
) AS email_count,
(
SELECT count(*) AS count_2
FROM phones, users
WHERE phones.user_id = users.id
) AS phone_count
我尝试使用GROUP BY并加入他们,但是由于某些用户同时没有电子邮件和电话,因此将它们排除在外,而且我不喜欢OUTER JOIN中的NULL。
更新的SQL:
select e.id, e.name, distinct_email, distinct_phone
from
(
select u.id, u.name, count(distinct e.id) as distinct_email
from users as u
left join emails as e
on u.id = e.user_id
group by u.id, u.name
) AS e
full outer join
(
select u.id, u.name, count(distinct p.id) as distinct_phone
from users as u
left join phones as p
on u.id = p.user_id
group by u.id, u.name
) AS p
on e.id = p.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.