postgres查询显示错误

问题描述 投票:-1回答:3

下面是我在同一个表本身上进行内连接的postgres查询。但是下面的查询在内连接之前显示错误。

select org.id, org.name, org.lft, org.rgt, tmp.id, tmp.name, tmp.lft, tmp.rgt from organization_organization as org WHERE (org.id IN (62)) 
INNER JOIN organization_organization as tmp ON (org.tree_id=tmp.tree_id) 
WHERE (tmp.id = org.id) OR (org.lft > tmp.lft AND org.rgt < tmp.rgt)
sql postgresql
3个回答
1
投票

因为你的JOIN语法不正确。 INNER JOIN关键字出现在WHERE子句之前

SELECT  org.id, 
        org.name, 
        org.lft, 
        org.rgt, 
        tmp.id, 
        tmp.name, 
        tmp.lft, 
        tmp.rgt 
FROM    organization_organization AS org 
        INNER JOIN organization_organization AS tmp 
            ON org.tree_id = tmp.tree_id
WHERE   org.id IN (62)
        AND 
        (
            (tmp.id = org.id) 
            OR (org.lft > tmp.lft AND org.rgt < tmp.rgt)
        )

2
投票

您的Join语法不正确,并且您的代码有两个where子句。在内部连接您的查询多次返回同一行,如果任何列值重复,为了避免这种重复,您必须使用DISTINCT。

select 
    distinct on(org.id)
    org.id, 
    org.name, 
    org.lft, 
    org.rgt, 
    tmp.id, 
    tmp.name, 
    tmp.lft, 
    tmp.rgt 
from 
    organization_organization as org 
INNER JOIN 
    organization_organization as tmp 
ON 
    org.tree_id=tmp.tree_id
WHERE 
    org.id IN (62)
and
    (
        tmp.id = org.id
OR 
        org.lft > tmp.lft AND org.rgt < tmp.rgt
    )
group by org.id

0
投票

将'WHERE(org.id IN(62))'放在第二个WHERE子句中

select org.id, org.name, org.lft, org.rgt, tmp.id, tmp.name, tmp.lft, 
tmp.rgt from organization_organization as org 
INNER JOIN organization_organization as tmp ON (org.tree_id=tmp.tree_id) 
WHERE ((tmp.id = org.id) OR (org.lft > tmp.lft AND org.rgt < tmp.rgt))
and (org.id IN (62)) 
© www.soinside.com 2019 - 2024. All rights reserved.