У меня есть три таблицы:
CREATE TABLE credential_types (
id serial PRIMARY KEY,
name varchar(32) NOT NULL,
...
);
CREATE TABLE credentials (
user_id integer REFERENCES users(id),
credential integer REFERENCES credential_types(id),
UNIQUE (user_id, credential)
);
CREATE TABLE users (
id serial PRIMARY KEY,
name varchar(64),
username varchar(64),
...
);
Теперь я хочу получить всех существующих пользователей и хочу выбрать конкретный тип учетных данных, который у них есть.Я попытался это сделать:
ribit=> SELECT u.id, u.name, u.username, ct.name AS cred \
FROM users u, credential_types ct, credentials c \
WHERE c.user_id=u.id AND ct.id=c.credential;
id | name | username | cred
----+------+----------+---------
1 | foo | bos | Try-Out
(1 row)
Это правильный вид вывода, но все пользователи, у которых еще нет учетных данных (ноль), не учтены.Я не знаю, какой тип соединения мне нужен для этой операции.Я думаю Мне нужно СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ, но я терплю неудачу, когда пытаюсь достичь того, что хочу:
ribit=> SELECT u.id, u.name, u.username, ct.name \
FROM users u, credential_types ct \
LEFT JOIN credentials c ON ct.id=c.credential;
дает мне перекрестное соединение с ошибочными данными.* Я ищу подсказки о том, как написать запрос для получения нужного результата.