多个内部连接,语法正确

Multiple inner join, correct syntax

提问人:cosman 提问时间:1/2/2023 最后编辑:forpascosman 更新时间:1/3/2023 访问量:76

问:

我想我要么误解了语法,要么有另一种用于多个连接的语法。

因此,我遇到了以下查询(SQLite3):

cur.execute('''Select department_name AS 'Department',
                (Employees.first_name ||' '|| Employees.last_name) AS 'Salesman',
                Orders.order_id AS 'OrderID',
                Products.product_name AS 'Product',
                ProductsOrders.cost AS 'Sales_Worth'
                From Departments
                Inner JOIN Employees ON Employees.department_id = Departments.department_id
                Inner JOIN Orders ON Orders.employee_id = Employees.employee_id
                INNER JOIN Products ON Products.product_id = ProductsOrders.product_id
                INNER JOIN ProductsOrders ON ProductsOrders.order_id = Orders.order_id
                ORDER BY Department''')

明确:department_name部门表的字段。

但是,我们怎么能只使用“来自部门”来说明上述所有内容

如果 Orders.order_id、Products.product_name、ProductsOrders.cost 不是 Departments 表的字段

我们难道不应该说:

FROM Orders, FROM Products, FROM ProductsOrders 

也?


(我之前遵循过以下语法):

SELECT columns
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
SQL 数据库 SQLite 内部联接 ansi-sql

评论

0赞 tony_ramos.98 1/2/2023
您可以使用该语句在 w3schools.com/sql/sql_view.asp 处创建视图。我认为 SQL 上不存在多个 FROM。因此,如果您的建议是只使用一个 from,我建议您使用视图。

答:

0赞 meskobalazs 1/2/2023 #1

如果执行联接,则是从联接的结果中进行选择,而不是从原始表中进行选择,因此,如果列的名称不明确,则只需指定表(或其别名)。

0赞 Machavity 1/2/2023 #2
Select department_name AS 'Department'

这样做的关键是确保为表设置别名。如果多个表具有给定的字段名称,则查询将失败

我们难道不应该也说吗?FROM Orders, FROM Products, FROM ProductsOrders

没有。重点是从多个相关的表中提取。如果存在不相关的记录,请考虑单独的查询。JOIN

0赞 forpas 1/3/2023 #3

我们不应该说 FROM 订单、FROM 产品、FROM 产品订单?

像这样的东西已经存在,它在大多数数据库中都是有效和允许的:

SELECT Departments.department_name AS 'Department',
       (Employees.first_name ||' '|| Employees.last_name) AS 'Salesman',
       Orders.order_id AS 'OrderID',
       Products.product_name AS 'Product',
       ProductsOrders.cost AS 'Sales_Worth'
FROM Departments, Employees, Orders, Products, ProductsOrders
WHERE Employees.department_id = Departments.department_id
  AND Orders.employee_id = Employees.employee_id
  AND Products.product_id = ProductsOrders.product_id
  AND ProductsOrders.order_id = Orders.order_id
ORDER BY Department

但是,上述语法已被符合 ANSI 的语法所取代,该语法对每个联接表使用关键字和一个子句(而不是将所有联接条件堆叠在子句中)。INNER JOINONWHERE

尽管这两种语法在性能方面是等效的(至少对于SQLite而言),但新语法是你应该学习的,因为随着时间的推移,你会发现它更具可读性,更灵活,更能描述你正在做的事情(特别是当你处理其他类型的连接时,如CROSS/LEFT/RIGHT/FULL连接)。

顺便说一句:切勿对表/列名/别名使用单引号。使用(如果需要)双引号、反引号或方括号。