我有几个表有关键字作为列名。我无法使用它们编写子查询。即使我使用不存在的列名,查询仍然有效。例如
CREATE TABLE tgt("view" int);
CREATE TABLE src(id int);
select * from tgt where view in (select view from src);
view
------
(0 rows)
select * from tgt where view in (select "view" from src);
view
------
(0 rows)
select * from tgt where "view" in (select "view" from src);
view
------
(0 rows)
select "view" from src;
ERROR: column "view" does not exist
LINE 1: select "view" from src;
insert into tgt values(1);
insert into src values(2);
select * from tgt where "view" in (select "view" from src);
view
------
1
(1 row)
select * from tgt where view in (select id from src);
view
------
(0 rows)
我有几个问题 - 当我在子查询中使用不存在的列名时,它可以工作。但是如果我在查询中使用相同的列名,我会收到错误。如何在子查询中使用关键字列名称而不会遇到这样的意外情况?我知道使用关键字作为列名并不是一个好主意,但系统已经存在了20年,现在不能更改列名。
答案 0 :(得分:1)
当我在子查询中使用不存在的列名时,它可以工作。
嗯,但不是你认为它有效的方式。
它将解析到查询的其他部分中的列(此处为另一个表)。
select * from tgt where view in (select view from src);
与
相同select * from tgt where view in (select tgt.view from src);
这与“查看”与列名称选择不相关无关,如果您的列名为“x”,则会发生同样的情况。
答案 1 :(得分:0)
另一种方法是使用内连接而不是子查询。列名中的歧义在这里更明显,您可以使用别名来消除歧义,例如:
select DISTINCT t.*
from tgt t
inner join src s
on t.view = s.view;