查询加入问题

时间:2008-11-13 17:36:25

标签: sql mysql join

我有一个正确的外连接,几乎可以实现我想要的......

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 个答案:

答案 0 :(得分: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'

哪些可能更快(见评论)。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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'

答案 3 :(得分:0)

您希望两个表中的所有记录加入用户ID,WHERE credit_acc是'init'还是没有要连接的credit_acc行? <怎么样

where credit_acc.type_acc is null  OR credit_acc.type_acc = 'init'

答案 4 :(得分: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,则两者之间没有区别。如果可以,您需要决定是否要在结果集中包含这些行。

答案 5 :(得分:0)

只需在Join Condition中添加另一个谓词。

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条件...

此语法更清楚地表示了您的意图......