繁体   English   中英

如何在带有SQLAlchemy的SELECT X FROM…中的位置X中使用子查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM