我正在努力学习SQL查询,但我还没有弄清楚哪些更有效。
这是我的代码:
SELECT A.CustName, A.CustID, C.RestName,
CONCAT(A.Address, ' - ', C.Address, ' + ', C.FoodTime, ' = ', A.Address - C.Address + C.FoodTime)
AS DeliveryTime, B.OrderID
FROM (SELECT * FROM Customers) AS A
LEFT JOIN (SELECT * FROM Orders) AS B
ON A.CustID = B.CustID
LEFT JOIN (SELECT * FROM Restaurants) AS C
ON B.RestID = C.RestID
ORDER BY A.CustID;
有三个表格Customers
,Restaurants
和Orders
。客户包含CustID,CustName和Address。餐馆包含RestID,RestName,地址和FoodTime。订单包含CustID,RestID和OrderID。
我认为这是一个维度和事实的练习,但我不是100%关于这些在表格方面进行交互的正确方法。如果有人对此有一个很好的解释,我都是耳朵(眼睛)。谢谢!
答案 0 :(得分:1)
如果您确实需要所有餐厅所有订单的所有客户信息,那么您的查询将会“工作”#34;。正如已经指出的那样(从sometable中选择*)和(sometable),有或没有括号,是相同的,大多数人只会把表名。
concat的第一部分将向您显示地址和食物时间信息。第二部分,你试图从另一个地址减去一个地址,然后添加一个时间,可能会给你一个错误,这取决于所使用的数据库(如果你的数据库解释" +"作为一个连接运算符,实际上可以减去地址,然后你可能获得一个有效的字符串,但似乎不太可能。)
第三,作为一种风格问题,给你的桌子提供别名a,b和c可能会让你感到困惑。一个字符别名是可以的,但在这种情况下乳清不会将r用于餐厅,o用于订单而c用于客户?
答案 1 :(得分:0)
首先,避免无用的(SELECT * FROM xxx) AS zzz
这应该更好:
SELECT C.CustName, C.CustID, R.RestName,
CONCAT(C.Address, ' - ', R.Address, ' + ', R.FoodTime, ' = ', C.Address - R.Address + R.FoodTime)
AS DeliveryTime, O.OrderID
FROM Customers AS C
LEFT JOIN Orders AS O
ON C.CustID = O.CustID
LEFT JOIN Restaurants AS R
ON O.RestID = R.RestID
ORDER BY C.CustID;
接下来,你真正想做什么?