我正在尝试
select *
from buildings
where levels = 3
join managers;
但它表示加入时出错。我希望将建筑物的ID与经理人表中的ID相匹配,以便我想要自然加入。
答案 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
我认为这会对你有帮助......