TABLE user
- id
- username
- email
- passwd
TABLE user_external
- id
- username
- email
- passwd
TABLE orders
- id
- user_id
- product
我有两个包含用户信息的表,我想合并以获取订单上的用户名。 我的select只从user表中获取名称(并从外部空白中删除),但不是user_external。
是否可以使用UNION用户表,然后进行左连接?
select
orders.product,
merged_user_table.name as name
FROM orders o
LEFT JOIN merged_user_table user_assigned_to ON o.user_id = merged_user_table.id
WHERE
orders.id = 1
答案 0 :(得分:1)
以下内容应该有效:
SELECT
orders.product
,merged_user_table.name as name
FROM orders o
LEFT JOIN (
SELECT id,username,email,passwd
FROM user
UNION ALL
SELECT id,username,email,passwd
FROM user_external
) merged_user_table user_assigned_to
ON o.user_id = merged_user_table.id
WHERE
orders.id = 1
我假设user
和user_external
表'用户是截然不同的在没有UNION
的情况下使用ALL
将有效地在子查询中的两个选择之间执行SELECT DISTINCT
,这样效率会降低。
答案 1 :(得分:0)
虽然您可以使用子查询获取一个联合表,然后将其连接到订单,这意味着主连接不会使用索引。
因此,我可能会使用2个单独的查询,一个与用户加入订单,另一个用user_external加入订单,并将结果合并在一起。
这应该有效(使用INNER JOIN而不是LEFT OUTER JOIN - 无法理解为什么使用LEFT OUTER JOIN但可能有原因)。您已指定返回名为name的列,但是两个用户表都没有这样的列,所以不确定是否要带回用户名或表名 - 所以下面的示例SQL将两者都带回来。
SELECT orders.product,
user.username as name,
'user' as table_name
FROM orders o
INNER JOIN user
ON o.user_id = user.id
WHERE orders.id = 1
UNION ALL
SELECT orders.product,
user_external.username as name,
'user_external' as table_name
FROM orders o
INNER JOIN user_external
ON o.user_id = user_external.id
WHERE orders.id = 1