INSERT INTO [dbo].[TestFactSales]
( [SalesOrderID]
, [SalesOrderDetailID]
, [OrderDateKey] -- Surrogate Key
, [ShipDateKey] -- Surrogate Key
, [CustomerKey] -- Surrogate Key
, [ProductKey] -- Surrogate Key
, [OrderQty]
, [UnitPrice]
, [UnitPriceDiscount]
)
SELECT
T2.SalesOrderID
, T1.SalesOrderDetailID
--, T2.OrderDate
, T6.CalendarDateKey
--, T2.ShipDate
, T5.CalendarDateKey
--, T2.CustomerID
, T4.CustomerKey
--, T1.ProductID
, T3.ProductKey
, T1.OrderQty
, T1.UnitPrice
, T1.UnitPriceDiscount
FROM [AdventureWorksLT2012].SalesLT.SalesOrderDetail as T1
JOIN [AdventureWorksLT2012].SalesLT.SalesOrderHeader as T2
ON T1.SalesOrderID = T2.SalesOrderID
JOIN Tempdb.dbo.TestDimProducts as T3
ON T1.ProductID = T3.ProductID
JOIN TempDB.dbo.TestDimCustomers as T4
ON T2.CustomerID = T4.CustomerID
JOIN TempDB.dbo.TestDimDates as T5
ON Cast(T2.ShipDate as date) = Cast(T5.CalendarDate as date)
JOIN TempDB.dbo.TestDimDates as T6
ON Cast(T2.OrderDate as date) = Cast(T6.CalendarDate as date)
;
go
您好, 我有一个关于低估上面代码的问题。这是用于数据仓库实现中非常常见的连接操作的t-sql语句。我的问题是,当我们连接两个表时:
FROM [AdventureWorksLT2012].SalesLT.SalesOrderDetail as T1
JOIN [AdventureWorksLT2012].SalesLT.SalesOrderHeader as T2
ON T1.SalesOrderID = T2.SalesOrderID
是否意味着在T2上连接表T1和T2?在select语句中,我们有
Select
T2.SalesOrderID
, T1.SalesOrderDetailID
因此,这个选择如何理解要查看哪个表,T1或T2? 你能否澄清一下这个问题?请注意,我理解别名表示。我不明白的是插入部分。要插入[SalesOrderID],我们需要查看来自T1和T2的连接表。但代码看起来是T2.SalesOrderID。
答案 0 :(得分:1)
联合表是两个表中所有列的组合 - 它不会创建一个新表,它只是来自两个表的样本。例如:
ON
子句中指定的行 - 因此在您的情况下,T1.SalesOrderID = T2.SalesOrderID 您使用了insert into (columns) select ... from joined table
语句。
TestFactSales
时要使用的列。SalesOrderID
的列,所以如果你只是把它放在那里,SQL就不知道要从哪个表中取出那个列。 ON
子句中指定了T1.SalesOrderID = T2.SalesOrderID。这意味着它们对于连接表中的所有内容都是相同的。但是:
答案 1 :(得分:0)
是否意味着在T2上连接表T1和T2?
它正在加入表SalesOrderDetail
和SalesOrderHeader
,并将它们别名为T1
和T2
。
因此,这个选择如何理解要查看哪个表,T1或T2?
它在查询中明确指定:
SELECT
T2.SalesOrderID
, T1.SalesOrderDetailID
因此,查询正在查找表SalesOrderID
中的T2
(SalesOrderHeader
的别名),并在表SalesOrderDetailID
中查找T1
}(这是SalesOrderDetail
的别名)。
这个(带表别名):
SELECT
T2.SalesOrderID,
T1.SalesOrderDetailID
FROM SalesOrderDetail AS T1
JOIN SalesOrderHeader AS T2
ON T1.SalesOrderID = T2.SalesOrderID
与此相同(没有表别名):
SELECT
SalesOrderHeader.SalesOrderID,
SalesOrderDetail.SalesOrderDetailID
FROM SalesOrderDetail
JOIN SalesOrderHeader
ON SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID
在查询中使用表别名只会缩短整个查询中所有长表名称的重复。 (虽然使用T1
和T2
这样的别名似乎模糊了有关这些表的有用信息,但是这个代码可能是由一个无法使用有意义的别名的工具自动生成的的名称。)
答案 2 :(得分:0)
以下代码使用T1
和T2
作为别名。 AS
子句创建表别名。因此,[AdventureWorksLT2012].SalesLT.SalesOrderDetail
现在可以被引用为T1
。
FROM [AdventureWorksLT2012].SalesLT.SalesOrderDetail as T1 JOIN
[AdventureWorksLT2012].SalesLT.SalesOrderHeader as T2 ON
T1.SalesOrderID = T2.SalesOrderID
在select语句中,T1
等同于[AdventureWorksLT2012].SalesLT.SalesOrderDetail
,当您键入ALIAS.Column_Name
时,sql将足够智能查找别名并搜索正确的表
Select
T2.SalesOrderID
, T1.SalesOrderDetailID
答案 3 :(得分:0)
查询正在查看表[AdventureWorksLT2012].SalesLT.SalesOrderDetail
和[AdventureWorksLT2012].SalesLT.SalesOrderHeader
。这是一对多的关系。
T1
和T2
只是长表名称的别名。
SalesOrderHeader
包含一般信息,例如SalesOrderId,customerId,orderDate。
SalesOrderDetail
表包含为此特定SalesOrderId
订购的商品。该表至少包含SalesOrderId,ItemId,Quantity。
加入这两张表将提供有关客户在此特定发票上购买的商品的信息。加入条件为T2.SalesOrderId = T1.SalesOrderId