Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有关交叉申请的澄清_Sql Server_Performance - Fatal编程技术网

Sql server 有关交叉申请的澄清

Sql server 有关交叉申请的澄清,sql-server,performance,Sql Server,Performance,我有一个表,其中包含给定日期内发生的信息,每行1天。 对于每一行,一个事件可能发生多次 | Id | Sector_1 | Sector_2 | WastedTime_1 | WastedTime_2 | FixingTime_1 | FixingTime_2 | |----|----------|----------|--------------|--------------|--------------|--------------| | 1 | A | B |

我有一个表,其中包含给定日期内发生的信息,每行1天。 对于每一行,一个事件可能发生多次

| Id | Sector_1 | Sector_2 | WastedTime_1 | WastedTime_2 | FixingTime_1 | FixingTime_2 |
|----|----------|----------|--------------|--------------|--------------|--------------|
|  1 | A        | B        |           15 |           30 |           30 |           60 |
|  2 | B        | C        |           60 |          120 |          120 |          240 |
请注意,我在这里显示了最多2个事件,但最多可以达到20个,并且还有多个其他列,例如DateTime_X、EmpName等

我想创建一个查询来透视数据,这样我就可以在每个事件中看到一行,即使ID是重复的。例:

| Id | Sector | WastedTime | FixingTime |
|----|--------|------------|------------|
|  1 | A      |         15 |         30 |
|  1 | B      |         30 |         60 |
|  2 | B      |         60 |        120 |
|  2 | B      |        120 |        240 |
我试图用支点来做,但没有成功。在我的研究过程中,我看到了交叉应用命令,并尝试了它,它成功了

SELECT      Id,
            StopEvent.*
FROM        #events
CROSS APPLY
(
    VALUES  (Sector_1, WastedTime_1, FixingTime_1),
            (Sector_2, WastedTime_2, FixingTime_2)
)   AS  StopEvent(Sector, WastedTime, FixingTime)

我的问题是为什么它会起作用?我读了一些关于这个命令的文章,但我仍然不明白它为什么会起作用。另外,交叉应用是执行此操作还是执行其他操作?

作为替代方法,您可以使用UNION:


您当前使用APPLY的方法可能优于union方法。

Paul White有几篇优秀的文章详细介绍了APPLY。我没有遇到,我会看一看谢谢!
SELECT Id, Sector_1 AS Sector, WastedTime_1 AS Wasted_Time, FixingTime_1 AS FixingTime FROM #events
UNION ALL
SELECT Id, Sector_2, WastedTime_2, FixingTime_2 FROM #events
ORDER BY Id, Sector;