如何通过 where 子句替换左连接中的条件?
How to replace a condition in left join through a where clause?
尝试使用 where 子句而不是左连接来获得相同的结果
表架构:
id
name
created_by
TableB 架构:
id
name
updated_by
示例表 A
id name created_by
1 pen a
2 paste k
示例表 B
id name updated_by
1 inkpen b
1 ballpen c
查询与左加入
select tablea.id, tableb.id, tablea.name, tableb.name
from tablea
left join tableb on tableb.id = tablea.id and tableb.updated_by = 'a'
结果
tablea.id tableb.id tablea.name tableb.name
1 NULL pen NULL
使用 where 子句查询:
select tablea.id, tableb.id, tablea.name, tableb.name
from tablea left join tableb
ON tableb.id = tablea.id WHERE tableb.updated_by = 'a'
结果
tablea.id tableb.id tablea.name tableb.name
NULL NULL NULL NULL
我们在传递 user_id 之前使用了一个函数。
该函数依次返回 table 并在左连接中使用 user_id。
由于函数没有使用索引,我们决定改用视图。
但是,在视图中,我们不能传递变量。因此我们无法在 Left join 中使用 tableb.updated_by,因此在 where
子句中尝试了相同的查询。
我们如何编写查询才能通过 where 子句获得与左连接相同的结果?
How can I write the query such that I can get the same result as in left join through where clause?
你不能。
LEFT JOIN
的 ON
子句中的条件未满足时,将第一个 table 的行与空值一起替换第二个 [=20= 的行].如果这些条件出现在 WHERE
子句中,则它们会在未满足时排除第一行。这有效地将您的 LEFT JOIN
转换为普通的内部 JOIN
.
您的真实表可能如下所示(主键粗体):
- item (item_id, name, created_by_user_id)
- itemuserupdate (item_id, updated_by_user_id, 名称)
- 用户(user_id,姓名)
你可以做的是首先获取所有 user/item 组合,然后外部连接现有条目:
create myview as
select i.item_id, i.name, u.user_id, iu.name as name_by_user
i.item_id,
u.user_id,
from users u
cross join item i
left outer join itemuserupdate iu on iu.itemid = i.itemid
and iu.updated_by_user_id = u.user_id;
然后您将此视图与
一起使用
select item_id, name, name_by_user from myview where user_id = 123;
尝试使用 where 子句而不是左连接来获得相同的结果
表架构:
id
name
created_by
TableB 架构:
id
name
updated_by
示例表 A
id name created_by
1 pen a
2 paste k
示例表 B
id name updated_by
1 inkpen b
1 ballpen c
查询与左加入
select tablea.id, tableb.id, tablea.name, tableb.name
from tablea
left join tableb on tableb.id = tablea.id and tableb.updated_by = 'a'
结果
tablea.id tableb.id tablea.name tableb.name
1 NULL pen NULL
使用 where 子句查询:
select tablea.id, tableb.id, tablea.name, tableb.name
from tablea left join tableb
ON tableb.id = tablea.id WHERE tableb.updated_by = 'a'
结果
tablea.id tableb.id tablea.name tableb.name
NULL NULL NULL NULL
我们在传递 user_id 之前使用了一个函数。
该函数依次返回 table 并在左连接中使用 user_id。
由于函数没有使用索引,我们决定改用视图。
但是,在视图中,我们不能传递变量。因此我们无法在 Left join 中使用 tableb.updated_by,因此在 where
子句中尝试了相同的查询。
我们如何编写查询才能通过 where 子句获得与左连接相同的结果?
How can I write the query such that I can get the same result as in left join through where clause?
你不能。
LEFT JOIN
的 ON
子句中的条件未满足时,将第一个 table 的行与空值一起替换第二个 [=20= 的行].如果这些条件出现在 WHERE
子句中,则它们会在未满足时排除第一行。这有效地将您的 LEFT JOIN
转换为普通的内部 JOIN
.
您的真实表可能如下所示(主键粗体):
- item (item_id, name, created_by_user_id)
- itemuserupdate (item_id, updated_by_user_id, 名称)
- 用户(user_id,姓名)
你可以做的是首先获取所有 user/item 组合,然后外部连接现有条目:
create myview as
select i.item_id, i.name, u.user_id, iu.name as name_by_user
i.item_id,
u.user_id,
from users u
cross join item i
left outer join itemuserupdate iu on iu.itemid = i.itemid
and iu.updated_by_user_id = u.user_id;
然后您将此视图与
一起使用select item_id, name, name_by_user from myview where user_id = 123;