我想我要么误解了语法,要么多个连接有另一种语法。
因此,我遇到了以下查询(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是Departments表的字段。
但是,我们如何能够仅使用"来自部门"来陈述所有上述内容
如果订单. order_id、产品. product_name、产品订单. cost不是部门表的字段?
我们是不是应该说:
FROM Orders, FROM Products, FROM ProductsOrders
也是吗
(我以前遵守过以下语法):
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
3条答案
按热度按时间v440hwme1#
我们是否还应该声明FROM订单、FROM产品、FROM产品订单?
类似这样的内容已经存在,并且在大多数数据库中是有效的和允许的:
但是上述语法已被 * ANSI兼容 * 语法所取代,该语法对每个连接表使用关键字
INNER JOIN
和一个ON
子句(而不是在WHERE
子句中堆叠所有连接条件)。尽管这两种语法在性能方面是等效的(至少对于SQLite来说是这样),但新的语法是您应该学习的,因为随着时间的推移,您会发现它对您正在做的事情更具可读性、灵活性和描述性(特别是当您处理其他类型的连接时,如CROSS/LEFT/RIGHT/FULL连接)。
作为旁注:表/列名/别名不要用单引号。2如果需要,可以用双引号、反引号或方括号。
jtoj6r0c2#
如果执行连接,则从连接的结果中选择,而不是从原始表中选择,因此,如果列名不明确,则只需指定表(或其别名)。
k2fxgqgv3#
关键是要确保为表设置别名。如果多个表具有给定的字段名,则查询将失败
我们不应该也写
FROM Orders, FROM Products, FROM ProductsOrders
吗?不完全是。
JOIN
的要点是从多个相关的表中拉取。如果有不相关的记录,请考虑单独的查询。