我想知道如何从多个表中获取多个列,即使一个表中的一列不存在,并返回一个或多个用于连接的表中存在的列
例如:
表:
user_pr_details:
[id] [first_name] [last_name]
urname:
[id] [email] [username]
profile_pic:
[id] [file_name ]
SQL:
SELECT a.first_name, a.last_name, b.username, c.file_name
FROM user_pr_details a,urname b,profile_pic c
WHERE a.user_id = b.urname_id
and b.urname_id = c.user_id
and c.user_id in (7,8,9)
问题:
for user_id in (7,8) all the columns in all three table exists..
whereas for user_id in (9) [file_name] doesn't exists in profile_pic table
so the query returns two rows for user_id in (7,8)
我需要什么? 如果某个列不存在于一个表中,则返回具有该数据的其余列,并在不存在的col的位置显示null或零。
答案 0 :(得分:2)
我想建议这个查询。
SELECT
upd.first_name
, upd.last_name
, u.username
, pp.file_name
FROM urname u
LEFT OUTER JOIN user_pr_details a ON u.urname_id = upd.user_id
LEFT OUTER JOIN profile_pic pp ON u.urname_id = pp.user_id
WHERE u.urname_id IN (7, 8, 9)
在创建SQL查询时,您需要做的第一个选择是“from table”。也就是说,您将参考的第一个表。这是一个重要的选择!理想情况下,该表“将永远可用于”查询,其他表“将关联但不控制”查询逻辑。
此查询与用户有关,因此有关用户的主表应为“from table”。
之后,我们需要“加入”其他信息,您已经在加入,但是您通过where clause
和join conditions
a.user_id = b.urname_id
以LEFT OUTER JOIN
的方式以旧式方式执行此操作(尽管这存在于where子句中,它仍然是一个连接条件)。我使用的是ANSI 92连接语法,这样做的好处之一就是我可以轻松地使用“外部”连接。这些连接类型允许记录存在于一个表中,但不存在于另一个表中。 LEFT OUTER JOIN
表示“from table”在左侧,因此记录可能存在于表urname中,而user_pr_details或profile_pic中没有任何匹配的记录。
如果不熟悉此语法,我建议this visual guide to joins,但请注意“OUTER”是一个可选字,因此WHERE clause
通常只是“LEFT JOIN”
注意我也改变了{{1}}。我们希望确保我们过滤信息的方式在“from table”上工作,如果可能的话,因为我们允许来自其他表的NULL。
小注:我使用了不同的表别名。我更喜欢这些与表名有关系所以'u'表示urname; user_pr_details的'upd';和'pp'代表profile_pic。我个人认为a,b,c太抽象了,如果你需要调整查询结构,那么它们就会很容易失序(就像他们为我做的那样!)