提问人:cosman 提问时间:1/2/2023 最后编辑:forpascosman 更新时间:1/3/2023 访问量:76
多个内部连接,语法正确
Multiple inner join, correct syntax
问:
我想我要么误解了语法,要么有另一种用于多个连接的语法。
因此,我遇到了以下查询(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;
答:
如果执行联接,则是从联接的结果中进行选择,而不是从原始表中进行选择,因此,如果列的名称不明确,则只需指定表(或其别名)。
Select department_name AS 'Department'
这样做的关键是确保为表设置别名。如果多个表具有给定的字段名称,则查询将失败
我们难道不应该也说吗?
FROM Orders, FROM Products, FROM ProductsOrders
没有。重点是从多个相关的表中提取。如果存在不相关的记录,请考虑单独的查询。JOIN
我们不应该说 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 JOIN
ON
WHERE
尽管这两种语法在性能方面是等效的(至少对于SQLite而言),但新语法是你应该学习的,因为随着时间的推移,你会发现它更具可读性,更灵活,更能描述你正在做的事情(特别是当你处理其他类型的连接时,如CROSS/LEFT/RIGHT/FULL连接)。
顺便说一句:切勿对表/列名/别名使用单引号。使用(如果需要)双引号、反引号或方括号。
上一个:SQL查找金额何时首次达到某个值
下一个:列定义的范围内的总和
评论