如果我在我的PostgreSQL数据库中运行这个SQL代码,它可以正常工作:
select
e.type_id,
s.copy_destination || '\'
FROM
ebooks.ebooks e, ebooks.static_text s
WHERE
e.status_id = 1但是当我加入这个连接的时候,一切都变成梨形了。所以如果我跑:
select
e.type_id,
s.copy_destination || '\'
FROM
ebooks.ebooks e, ebooks.static_text s
join
ebooks.types y
on
e.type_id = y.type_id
WHERE
e.status_id = 1 我收到以下错误消息:
ERROR: invalid reference to FROM-clause entry for table "e"
LINE 11: e.type_id = y.type_id
^
HINT: There is an entry for table "e", but it cannot be referenced from this part of the query.
SQL state: 42P01
Character: 159我尝试过使用完整引用(ebooks.eboooks.type_id),而不是仅仅使用e,但是没有什么改变。我仍然得到了“对表e的FROM-子句条目的引用无效”--注意,它仍然认为我试图引用表e。
我做错了什么?
发布于 2022-09-23 01:13:18
原因是FROM列表中的逗号(FROM)几乎是,但与CROSS JOIN不完全相同。显式联接语法在逗号之前绑定,换句话说,逗号分隔得更强。因此,将对e.type_id的引用放在该表仍然超出作用域的位置。请参见:
您可以用另一个等价的CROSS JOIN替换逗号,以使错误保持沉默:
SELECT e.type_id, s.copy_destination || '\'
FROM ebooks.ebooks e
CROSS JOIN ebooks.static_text s -- !!!
JOIN ebooks.types y ON e.type_id = y.type_id
WHERE e.status_id = 1;重新排列以使更清楚:
SELECT e.type_id, s.copy_destination || '\'
FROM ebooks.ebooks e
-- JOIN ebooks.types y USING (type_id)
CROSS JOIN ebooks.static_text s -- now you might as well use a comma again!
WHERE e.status_id = 1我完全地注释掉了ebooks.types的连接,因为它似乎是死的运费&假设引用完整性是由FK约束保证的。
问题仍然是,表static_text是无条件地连接到其余部分的,这就产生了两个集合的笛卡儿积。通常不是你想要的..。
发布于 2022-09-23 00:47:43
select
e.type_id,
s.copy_destination ||
'\'
FROM
ebooks.static_text s Join ebooks.ebooks e
on s.ref_id = e.id
join
ebooks.types y
on
e.type_id = y.type_id
WHERE
e.status_id = 1将查询更改为此格式,然后它就可以工作了。ref_id和id是两个表的连接列的名称。这样更改,因为查询中的表顺序和两个表中的多个连接列(超过一个列get联接)的顺序可能是造成此错误的原因。
https://stackoverflow.com/questions/73821882
复制相似问题