sqlite 多个内部连接,语法正确

3j86kqsm  于 2023-01-05  发布在  SQLite
关注(0)|答案(3)|浏览(208)

我想我要么误解了语法,要么多个连接有另一种语法。
因此,我遇到了以下查询(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_nameDepartments表的字段。
但是,我们如何能够仅使用"来自部门"来陈述所有上述内容
如果订单. 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;
v440hwme

v440hwme1#

我们是否还应该声明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连接)。
作为旁注:表/列名/别名不要用单引号。2如果需要,可以用双引号、反引号或方括号。

jtoj6r0c

jtoj6r0c2#

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

k2fxgqgv

k2fxgqgv3#

Select department_name AS 'Department'

关键是要确保为表设置别名。如果多个表具有给定的字段名,则查询将失败
我们不应该也写FROM Orders, FROM Products, FROM ProductsOrders吗?
不完全是。JOIN的要点是从多个相关的表中拉取。如果有不相关的记录,请考虑单独的查询。

相关问题