我的代码是:
SELECT *
FROM accounts,test
WHERE accounts.Username = test.Username AND test.Username IN ('BigD')
如果测试表中没有任何内容,我仍然想要返回accounts表中的内容。目前,只有两个表都获得了一些信息才会返回信息。怎么做? 听说如果你使用FULL JOIN就可以了,但是不知道如何在这里实现它。
答案 0 :(得分:2)
尝试LEFT JOIN
:
SELECT *
FROM accounts LEFT JOIN test
ON accounts.Username = test.Username
WHERE test.Username IN ('BigD')
您的原始查询是使用旧的ANSI-89连接方式编写的,其中连接的条件显示在WHERE
子句中。除了难以阅读之外,还很难弄清楚如何修改查询以获得所需内容。
答案 1 :(得分:0)
你不需要一个完整的加入,但是一个外部加入:
SELECT * FROM accounts
LEFT OUTER JOIN test ON accounts.Username= test.Username
WHERE test.Username IN ('BigD')
因此,您将获得" account"的所有行并且仅匹配来自" test"的行使用" test.Username IN(' BigD')" !
如果您只希望在帐户中获得一个匹配并列出测试中的所有匹配项,则可以通过以下方式撤消连接:
SELECT * FROM accounts
RIGHT OUTER JOIN test ON accounts.Username= test.Username
WHERE test.Username IN ('BigD')
注意:" OUTER"关键字是optionnal!
答案 2 :(得分:0)
正确的语法将WHERE
中的条件移动到ON
子句,因为它位于第二个表上。
但是,您可能还是希望在第一个表上进行测试:
SELECT a.*, t.*
FROM accounts a LEFT JOIN
test t
ON a.Username = t.Username
WHERE a.Username IN ('BigD');
如果您不希望在结果集中两次username
,请使用USING
代替ON
:
SELECT a.*, t.*
FROM accounts a LEFT JOIN
test t
USING (username)
WHERE Username IN ('BigD');