选择左连接但不显示连接内的数据 table

Selection with left join but without showing the Data inside the joined table

我有一个 table 结构有 2 tables

一个table这样的人:

id name etc.   
1  test   
2  smith  
3  shaw

和第二个 table personhist 我记录了名字的变化,就像这样:所以如果有人因为结婚或类似的事情改变了他的名字,我仍然有旧名字。

id personid name    etc.
1     1     oldtest

现在我有以下查询

select * from person p
Left join personhist ph on p.id = ph.personid
where (upper(p.name) = upper('oldtest') or upper(ph.name) like upper('oldtest'));

此查询将产生以下结果

id name    id personid name
1  test    1  1        oldtest

但我只想得到真实姓名结果。所以问题是:如果我加入的 table 中有记录,有没有办法只显示来自 "main" table 的数据?

select p.*, coalesce(p.name, ph.name)
from person p
Left join personhist ph on p.id = ph.personid
where (upper(p.name) = upper('oldtest') or upper(ph.name) like upper('oldtest'))

But I'd like to have only the actuel name result. So the question is is there a way to only show data from the "main" table also if there is a record in the table i join?

只要不包含您不想显示的列即可。您正在使用 SELECT * 这在任何生产系统上实际上都不是一件好事。您应该只指定那些需要的列名。

如果您真的想显示 table 之一的所有列,那么在您的查询中,因为您已经有一个 别名 table 名称,使用相同的别名仅包括 table 的列。

select p.* - 这将包括别名为 p.

table persons 的所有列

select ph.* - 这将包括别名为 ph.

table personhist 的所有列

要仅包含选定的列,请明确提及它们。例如-

select p.id, p.name, ph.personid...

我猜你需要的是-

select p.*, ph.personid 
  from person p
 Left join personhist ph on p.id = ph.personid
where (upper(p.name) = upper('oldtest') or upper(ph.name) like upper('oldtest'));

但我真的很怀疑加入的目的是什么,因为你只需要显示第一个table而已。

正如其他人提到的(我不会继续),您可以通过在 SELECT 中指定您实际需要的列来获取所需的数据,例如:

select p.name from person p
  Left join personhist ph on p.id = ph.personid
 where (upper(p.name) = upper('oldtest') or upper(ph.name) like upper('oldtest'));

但我想解决一个单独的问题。为什么在这种情况下使用 LIKE?没有任何通配符,因此您可以同样轻松地使用 =。此外,您还可以执行以下操作:

SELECT p.name
  FROM person p LEFT JOIN personhist ph
    ON p.id = ph.personid
 WHERE 'OLDTEST' IN ( UPPER(p.name), UPPER(ph.name) );

如果您正在搜索以 OLDTEST 开头的历史名称,那么您需要这样做:

SELECT p.name
  FROM person p LEFT JOIN personhist ph
    ON p.id = ph.personid
 WHERE ( UPPER(p.name) = UPPER('oldtest')
      OR UPPER(ph.name) LIKE UPPER('oldtest') || '%');

最后,确保您在 PERSON 上有一个基于函数的索引(也许在 PERSONHIST 上也有一个),如下所示:

CREATE INDEX person_name_upper ON person ( UPPER(name) );