选择左连接但不显示连接内的数据 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) );
我有一个 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
.
persons
的所有列
select ph.*
- 这将包括别名为 ph
.
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) );