запрос присоединиться вопрос - PullRequest
1 голос
/ 13 ноября 2008

У меня есть правильное внешнее соединение, которое почти делает то, что я хочу ...

SELECT
users_usr.firstname_usr,
users_usr.lastname_usr,
credit_acc.given_credit_acc,
users_usr.created_usr,
users_usr.sitenum_usr,
users_usr.original_aff_usr,
users_usr.id_usr
FROM
credit_acc
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr

Проблема в том, что я хочу добавить

where credit_acc.type_acc = 'init'

Но это избавляет от всех пользователей, у которых нет строки в credit_acc ... почему я нуждаюсь в правом внешнем соединении.

Есть ли способ получить это без необходимости выполнять два запроса и объединение?

Ответы [ 6 ]

4 голосов
/ 13 ноября 2008
SELECT
users_usr.firstname_usr,
users_usr.lastname_usr,
credit_acc.given_credit_acc,
users_usr.created_usr,
users_usr.sitenum_usr,
users_usr.original_aff_usr,
users_usr.id_usr
FROM
credit_acc
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr
WHERE credit_acc.type_acc = 'init' OR credit_acc.type_acc is NULL

Или, как заметил @Tomalak:

WHERE COALESCE(credit_acc.type_acc, 'init') = 'init'

который может быть быстрее (см. Комментарии).

2 голосов
/ 13 ноября 2008

Если строка не существует, credit_acc.type_acc должно быть нулевым. Вы можете попробовать что-то вроде этого:

WHERE credit_acc.type_acc = 'init' OR credit_acc.type_acc IS NULL;

Это будет работать, только если в credit_acc.type_acc нет пустых полей.

1 голос
/ 13 ноября 2008

Вы пробовали следующее?

SELECT
users_usr.firstname_usr,
users_usr.lastname_usr,
credit_acc.given_credit_acc,
users_usr.created_usr,
users_usr.sitenum_usr,
users_usr.original_aff_usr,
users_usr.id_usr
FROM
credit_acc
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr and credit_acc.type_acc = 'init'
0 голосов
/ 13 ноября 2008

Просто добавьте еще один предикат в условие соединения.

SELECT  U.firstname_usr, U.lastname_usr, C.given_credit_acc, 
        U.created_usr, U.sitenum_usr, U.original_aff_usr, U.id_usr
From credit_acc C Right Join users_usr U
   On C.uid_usr = U.id_usr
      And C.type_acc = 'init'

Это работает, потому что применяются условия соединения ДО того, как несовпадающие записи из "другой" стороны "внешнего" соединения будут добавлены в результирующий набор, тогда как условия применяются после объединения двух таблиц ...

Этот синтаксис более четко отражает ваши намерения ...

0 голосов
/ 13 ноября 2008

Я бы сделал предикат:

WHERE credit_acc.uid_usr IS NULL OR credit_acc.type_acc = 'init'

Это даст вам строки, в которых нет совпадения по UID_USR, и строки, в которых есть совпадение и тип учетной записи - 'init'.

Другое предлагаемое решение (проверка type_acc на NULL) также даст вам строки, в которых есть совпадение с UID_USR, а фактическое значение для типа счета равно NULL.

Если credit_acc.type_acc не может быть НЕДЕЙСТВИТЕЛЕН, между ними нет никакой разницы. Если это возможно, вам нужно решить, хотите ли вы включить эти строки в набор результатов.

0 голосов
/ 13 ноября 2008

Вы хотите, чтобы все записи из двух таблиц были объединены по идентификатору пользователя, ГДЕ credit_acc - это 'init' ИЛИ ​​где нет строки credit_acc, к которой нужно присоединиться? Как насчет

where credit_acc.type_acc is null  OR credit_acc.type_acc = 'init'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...