如何成功使用JOIN查询?

时间:2018-11-18 22:39:49

标签: 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,
    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的模型和制造商列,CUSTOMER的名称列和RENTAL的dueDate列,但仅用于行中SCOOTER.model = RENTAL.modelRENTAL.returnDate is 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”的条目,但是不能从查询的这一部分中引用它。   声明:SELECT s.model,s.manufacturer,c.name,r.duedate from SCOOTER AS s,CUSTOMER AS           以r.model = s.model和r.returnDate r r.duedate desc排序的r的内部联接租用;

     

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

2 个答案:

答案 0 :(得分:1)

嗯,我认为您应该学习更好的SQL。您仅连接表RENTAL和SCOOTER,但没有与CUSTOMER建立连接。

您的代码应该看起来更像

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;

希望有帮助!

欢呼

答案 1 :(得分:0)

您在这里混合了联接样式,这是需要避免的。连接看起来像这样:

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。随着更多表中更多数据的加入,这将导致数据横向增长。表甚至可以连接在一起。

很难深入了解JOIN的各个方面,因此可能需要一些背景知识