Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何成功使用联接查询?_Sql_Postgresql_Join - Fatal编程技术网

Sql 如何成功使用联接查询?

Sql 如何成功使用联接查询?,sql,postgresql,join,Sql,Postgresql,Join,以下是我的模式: CREATE TABLE CUSTOMER ( customerID numeric, name text, email varchar(320), cell varchar, address varchar, flag text NULL, PRIMARY KEY(customerID) ); CREATE TABLE REFERRALS ( customerID numeric NOT NULL, n

以下是我的模式:

CREATE TABLE CUSTOMER
(
    customerID numeric,
    name text,
    email varchar(320),
    cell varchar,
    address varchar,
    flag text NULL,
    PRIMARY KEY(customerID)
);

CREATE TABLE REFERRALS
(
    customerID numeric NOT NULL,
    name text NOT NULL,
    PRIMARY KEY(customerID, name)
);

CREATE TABLE RENTAL
(
    customerID numeric NOT NULL,
    model numeric NOT NULL,
    borrowDate timestamp NOT NULL,
    dueDate date NOT NULL,
    charge money NOT NULL,
    returnDate timestamp NULL,
    addFees money NULL,
    notes text NULL,
    PRIMARY KEY(customerID, model, borrowDate)
);

CREATE TABLE SCOOTER
(
    model bigserial NOT NULL,
    manufacturer text NOT NULL,
    country text NOT NULL,
    range numeric NOT NULL,
    weight numeric NOT NULL,
    topspeed numeric NOT NULL,
    condition text NOT NULL,
    availability text NOT NULL,
    PRIMARY KEY(model)
);
对于第一个查询,我想显示
SCOOTER
中的model和manufacturer列、
CUSTOMER
中的name列以及
rent
中的dueDate列,但仅显示
SCOOTER.model=rent.model
rent.returnDate为NULL
的行。最后,按dueDate的降序排列

这是我写的查询:

SELECT 
    s.model, s.manufacturer, c.name, r.duedate 
FROM 
    SCOOTER AS s, CUSTOMER AS c 
INNER JOIN 
    RENTAL AS r ON r.model = s.model AND r.returnDate IS NULL 
ORDER BY 
    r.duedate DESC;
然而,我得到了这个错误:

提示:表“s”有一个条目,但不能从查询的这一部分引用它。
声明:选择s.model、s.manufacturer、c.name、r.duedate FROM SCOOTER作为s,客户作为c r.model=s.model和r.returnDate上的r的内部联接租赁是r.duedate desc的空订单

错误:对表“s”的FROM子句项的引用无效
第2行:r.model=s.model和r.returnDate上的内部连接租赁作为r…
^ 提示:表“s”有一个条目,但不能从查询的这一部分引用它


嗯,我认为你应该学习更好一点的SQL。您只连接table RENTAL和SCOOTER,但忽略了与客户的连接

您的代码应该看起来更像

SELECT SCOOTER.model, SCOOTER.manufacturer, CUSTOMER.name, RENTAL.duedate
FROM SCOOTER
INNER JOIN RENTAL ON RENTAL.model = SCOOTER.model
INNER JOIN CUSTOMER ON RENTAL.customerID = CUSTOMER.customerID
WHERE RENTAL.returnDate IS NULL ORDER BY RENTAL.duedate desc;
希望有帮助


干杯

你在混合加入风格,这是需要避免的。连接如下所示:

SELECT * FROM 
a 
INNER JOIN b ON a.column = b.column
INNER JOIN c ON a.column = c.column ...
a中的每一行都连接到b中的每一行,其中ON子句为true。然后,a-b中的每一行再次连接到C,其中ON子句为true。这会导致数据横向增长,因为来自更多表的更多数据被连接在一起。表甚至可以连接到它们自己


要深入了解连接的各个方面是很困难的(对于SO来说也是离题的),因此一些背景阅读可能是必要的

在“开”或“在这里”中添加任何条件都没有问题。@philipxy感谢您指出这一点,我会更正我的答案!见我对这个问题的评论。这只是优先级的问题。逗号的可能重复会产生交叉连接,但其优先级低于显式关键字连接。因此,先进行连接。因此,s不在ON的范围内。用交叉连接代替逗号就可以了。但是,你从阅读许多点击的所有答案中学到了什么呢?我做了后者&第一次击中回答了你的问题。PS不要把逗号和连接混在一起。PS这是一个常见问题,但如果没有错误消息,很难找到。但是要确保你已经阅读了手册中关于你使用的每一件东西。这是一个常见问题解答。请总是用谷歌搜索你的问题/问题/目标的许多清晰、简洁和具体的版本/措辞,有或没有你的特定字符串/名称&“site:stackoverflow.com”&标记并阅读许多答案。将发现的相关关键字添加到搜索中。如果你找不到答案,就发布,使用1个变体搜索作为标签的标题和关键字。请参见文本上方的向下投票箭头鼠标。当你有一个非重复代码问题要发布时,请阅读并采取行动。