データベースに次の表があるとします。
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 は嫌いです。