1

データベースに次の表があるとします。

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 は嫌いです。

4

1 に答える 1

1

更新された 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
于 2013-10-28T03:25:02.330 に答える