如何通过 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 JOINON 子句中的条件未满足时,将第一个 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;