postgresql 横向连接与右连接

6ss1mwsb  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(193)

所以我有两张tableA和B
首先我做一个A与一列(项目)的横向连接

select A.id, item->>'id' as item_id, b.id 
from a, jsonb_array_elements(items) rx(item)

然后我对表b执行右连接(只有2行,id为1和2)

select A.id, item->>'id' as item_id, b.id 
from a, jsonb_array_elements(items) rx(item) 
right join b on b.id::varchar = item->>'id'

我的主要问题是,为什么正确的连接不删除item_id = 3和4的行?为什么还是空的另一方面,如果我将交叉横向连接改为左横向连接,它解决了我的问题。但我想了解这个特定查询中的计算顺序。

rdrgkggo

rdrgkggo1#

另一方面,如果我将交叉横向连接改为左横向连接,它解决了我的问题。
你一开始没有交叉联接,你有一个逗号联接。它们并不完全相同,因为逗号连接的优先级较低。如果将它从逗号连接更改为真正的交叉连接,也可以解决这个问题。
我认为这可能是一个bug。逗号连接应该抛出一个错误,因为“items”列在需要它的地方应该是不可用的。

smdncfj3

smdncfj32#

我记得,您使用RIGHT join从右侧(示例中的表b)获取所有记录,并使用ON子句条件从左侧(表a)获取相应的记录。如果右侧的记录在左侧没有对应的记录,则从左侧选择的字段为NULL。
使用LEFT join可以获得相反的效果,或者将表彼此交换。
如果你想在两个表中得到完全对应的记录,使用JOIN和ON子句(或者INNER JOIN,是一样的)。
如果使用不带ON子句的JOIN(或不带JOIN OR WHERE的FROM A,B),您将获得笛卡尔积:左侧的所有记录合并(加上)右侧的所有记录。

相关问题