1

我有一个正确的外部连接,几乎可以满足我的需求......

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 中没有一行的用户......这就是为什么我需要一个右外连接。

有没有办法在不必做两个查询和一个联合的情况下得到这个?

4

6 回答 6

4
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'

可能更快(见评论)。

于 2008-11-13T17:39:00.997 回答
2

如果该行不存在,credit_acc.type_acc应该为空。你可以尝试这样的事情:

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

这只有在credit_acc.type_acc中没有空字段时才有效。

于 2008-11-13T17:42:03.550 回答
1

您是否尝试过以下操作?

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'
于 2008-11-13T17:41:20.353 回答
0

您想要两个表中的所有记录,在用户 ID 上加入,在哪里 credit_acc 是 'init' 或者没有要加入的 credit_acc 行?怎么样

where credit_acc.type_acc is null  OR credit_acc.type_acc = 'init'
于 2008-11-13T17:45:27.007 回答
0

我会做谓词:

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 不能为 NULL,则两者没有区别。如果可以,您需要决定是否要将这些行包含在结果集中。

于 2008-11-13T18:54:29.847 回答
0

只需将另一个谓词添加到联接条件。

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'

之所以有效,是因为在将“外部”连接的“另一”侧的不匹配记录添加到结果集中之前应用了连接条件,而在连接两个表之后应用了 Where 条件......

这种语法也更清楚地代表了您的意图......

于 2008-11-13T19:14:54.720 回答