首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这种联接语法有什么问题?

这种联接语法有什么问题?
EN

Stack Overflow用户
提问于 2022-09-23 00:28:59
回答 2查看 40关注 0票数 2

如果我在我的PostgreSQL数据库中运行这个SQL代码,它可以正常工作:

代码语言:javascript
复制
select 
    e.type_id,
    s.copy_destination || '\'
FROM 
    ebooks.ebooks e, ebooks.static_text s
WHERE
    e.status_id = 1

但是当我加入这个连接的时候,一切都变成梨形了。所以如果我跑:

代码语言:javascript
复制
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 

我收到以下错误消息:

代码语言:javascript
复制
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。

我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2022-09-23 01:13:18

原因是FROM列表中的逗号(FROM)几乎是,但与CROSS JOIN不完全相同。显式联接语法在逗号之前绑定,换句话说,逗号分隔得更强。因此,将对e.type_id的引用放在该表仍然超出作用域的位置。请参见:

您可以用另一个等价的CROSS JOIN替换逗号,以使错误保持沉默:

代码语言:javascript
复制
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;

重新排列以使更清楚:

代码语言:javascript
复制
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是无条件地连接到其余部分的,这就产生了两个集合的笛卡儿积。通常不是你想要的..。

票数 1
EN

Stack Overflow用户

发布于 2022-09-23 00:47:43

代码语言:javascript
复制
    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联接)的顺序可能是造成此错误的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73821882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档