JOIN语句不与where子句一起使用

时间:2012-09-23 10:08:40

标签: sql postgresql join

我正在尝试

select * 
from buildings 
where levels = 3 
join managers;

但它表示加入时出错。我希望将建筑物的ID与经理人表中的ID相匹配,以便我想要自然加入。

4 个答案:

答案 0 :(得分:2)

如果你将JOIN放在正确的位置(在FROM和WHERE之间)并且在没有ON的情况下编写JOIN是合法的,那么结果将是一个交叉连接 - 一个笛卡尔积,然后你在WHERE中过滤。

这是一个非常有效的事情,尽管不大可能是你在这种情况下的意图。可以通过向FROM子句添加逗号分隔表来实现,例如:

FROM buildings, managers

当您打算在条件上连接两个表时,编写显式内连接通常会更好:

SELECT *
FROM buildings b INNER JOIN managers m ON (b.manager_id = m.manager_id)
WHERE b.levels = 3;

...因为它让其他人在阅读声明时明确表示ON子句是一个连接条件,而bl.levels=3是一个过滤器。 SQL实现通常不关心,很可能将上述内容转换为:

SELECT *
FROM buildings b, managers m
WHERE b.levels = 3 AND b.manager_id = m.manager_id;
无论如何,

内部,但是当使用显式连接语法编写时,使用多个连接理解复杂查询会更容易(IMO)。

还有另一种方法可以写出你想要的东西,但这很危险,不应该使用IMO:

SELECT * 
FROM buildings bl
NATURAL JOIN managers m                                      
WHERE bl.levels = 3;

在任何名称相同的列上加入。这是调试的噩梦,你必须查找表结构以了解它的作用,如果有人重命名列,它就会中断,这很痛苦。不使用。请参阅Table expressions in the PostgreSQL manual

更可接受的是上面讨论过的USING语法:

SELECT * 
FROM buildings bl
INNER JOIN managers m USING (manager_id)
WHERE bl.levels = 3;

匹配两列中名为manager_id的列和它们上的JOIN列,将它们组合成一列,但与NATURAL JOIN不同,它是明确的,没有可怕的魔法。

我仍然愿意写INNER JOIN ... ON (...),但使用USING和IMO是合理的,使用NATURAL是不合理的。


测试表结构是:

create table managers ( manager_id integer primary key );

create table buildings (
    manager_id integer references manager(manager_id),
    levels integer
);

答案 1 :(得分:1)

JOIN运算符应用于表,您应该在FROM子句中提供它。如果这样做,您将收到一条新错误,声称没有JOIN条件,因为您必须在JOIN子句之后提供ON条件(它不是可选的):< / p>

SELECT * 
FROM  buildings b JOIN managers m ON b.managerid = m.id
WHERE b.levels = 3 

答案 2 :(得分:0)

如果你想这样做,你必须写下这样的东西:

select * 
from bulidings b
join managers m on b.id=m.id
where levels = 3

但请求似乎很奇怪,我相信其中一个应该有一个外键到另一个。所以更合适的查询是:

select *
from buidings b
join managers m on b.id = m.building_id //// or b.manager_id = m.id
where levels = 3

答案 3 :(得分:-1)

我认为你写的是哪个查询是错误的。

所以请试试这个

 select * from buildings as bl
    join managers as mn on bl.F_ManagerID = mn.ManagerID
    where bl.levels = 3

我认为这会对你有帮助......