我正在使用在线资源来学习SQL语言,但是主要是使用前辈在公司编写的查询。我正在相应地编辑字段以产生正确的结果。但我想了解更多。
我对这段代码有一些疑问。 1.为什么在TrackingNumber之前有一个“ p”,而在其他人前面有oh / cc / im? 选择哪一个似乎很重要,因此我只需要反复尝试就可以运行。 2.为什么需要跟踪号-删除此行时,代码将无法运行!
select
p.TrackingNumber
,im.Sku
,oh.BusinessUnitCode
,cc.Qty
,oh.ShipCode
,oh.OrigShipCode
,oh.Store
,convert(date,oh.ShipTime) as 'OrderDate'
,oh.ShipToName
,oh.OrderNumber
from dmhost.tblOrderHeader oh
join dmhost.tblContainer c on oh.OrderHeaderID = c.OrderHeaderID
join dmhost.tblPackage p on c.ContainerID = p.ContainerID
join dmhost.tblContainerContents cc on c.ContainerID = cc.ContainerID
join dmhost.tblItemMaster im on im.ItemMasterID = cc.ItemMasterID
where (oh.ShipTime between '04/07/2019' and '05/05/2019')
答案 0 :(得分:0)
您谈论的字母是指表名(或别名)。
使用别名的示例为:
SELECT c.customerName, o.orderNumber from Customers c
INNER JOIN Orders o on c.id=o.customerid
没有别名的相同查询:
SELECT Customers.customerName, Orders.orderNumber from Customers
INNER JOIN Orders on Customers.id=Orders.customerid
或省略表名
SELECT customerName, orderNumber from Customers
INNER JOIN Orders on Customers.id=Orders.customerid
从不同的表中检索具有相同名称的列时,表名称特别重要。例如,来自客户的ID和来自订单的ID
SELECT c.id as CustomerId, o.id as OrderId from Customers c
INNER JOIN Orders o on c.id=o.customerid
答案 1 :(得分:0)
您的字段名称中的点(.
)之前的位是table aliases。如果您查看此查询的FROM
子句,则应该在其中列出的各个表的前面看到这些缩写。他们习惯了
a)减少键入表名和
的繁琐工作b)清楚地说明了您从哪个表中选择列(这不仅增加了代码的可读性,而且还处理了其中两个表具有相同名称的列的情况)
这是表别名用法的简单示例:
SELECT emp.ID, emp.Name, dep.ID, dep.Name
FROM employees emp
INNER JOIN departments dep ON dep.ID = emp.DepartmentID
在这里您可以看到employee和department表每个都有别名以缩短其名称。在查询中,我们使用别名来引用每个字段。这特别有用,因为两个表都有名为“ ID”和“ Name”的字段。
关于删除p.TrackingNumber
时崩溃的原因,可能是因为您还没有从下一行删除逗号(,
)。逗号用于标记下一个字段名称的开始位置-它可以在上一行的末尾,而不是下一个字段的开始。显然,您不能使用逗号开头字段列表,因为在它之前没有字段名称-因此会出现语法错误。
本来可以写相同的查询
select
p.TrackingNumber,
im.Sku,
oh.BusinessUnitCode,
-- etc
这可能使查看逗号的用法更加容易。