相关疑难解决方法(0)

1514
推荐指数
12
解决办法
146万
查看次数

什么时候应该使用交叉申请而不是内部联接?

使用CROSS APPLY的主要目的是什么?

我已经阅读(模糊地,通过互联网上的帖子),cross apply如果你正在进行分区,那么在选择大型数据集时可以更有效率.(寻找灵感)

我也知道CROSS APPLY 不需要UDF作为右表.

在大多数INNER JOIN查询(一对多关系)中,我可以重写它们以供使用CROSS APPLY,但它们总是给我相同的执行计划.

任何人都可以给我一个很好的例子,告诉我什么时候能有效的CROSS APPLY情况INNER JOIN


编辑:

这是一个简单的例子,执行计划完全相同.(告诉我一个他们不同的地方,哪里cross apply更快/更有效率)

create table Company (
    companyId int identity(1,1)
,   companyName varchar(100)
,   zipcode varchar(10) 
,   constraint PK_Company primary key (companyId)
)
GO

create table Person (
    personId int identity(1,1)
,   personName varchar(100)
,   companyId int
,   constraint FK_Person_CompanyId foreign key (companyId) references dbo.Company(companyId)
,   constraint PK_Person primary key (personId)
) …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server performance cross-apply

890
推荐指数
11
解决办法
68万
查看次数

在哪里使用外涂

主表

x------x--------------------x
| Id   |        Name        |
x------x--------------------x
|  1   |          A         |
|  2   |          B         |
|  3   |          C         |
x------x--------------------x
Run Code Online (Sandbox Code Playgroud)

详情表

x------x--------------------x-------x
| Id   |      PERIOD        |   QTY |
x------x--------------------x-------x
|  1   |   2014-01-13       |   10  |
|  1   |   2014-01-11       |   15  |
|  1   |   2014-01-12       |   20  |
|  2   |   2014-01-06       |   30  |
|  2   |   2014-01-08       |   40  |
x------x--------------------x-------x
Run Code Online (Sandbox Code Playgroud)

LEFT JOINOUTER APPLY使用时得到相同的结果.

LEFT JOIN

SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server left-join sql-server-2008 outer-apply

10
推荐指数
1
解决办法
6338
查看次数

在SQL Server中选择一组日期

我有一个历史表来捕获某个对象的更新,除了其他信息之外,还会捕获此更新发生的时间.我想这样做是SELECTMIN(LogDate)对应于某一ActionTaken列.

更具体地说,历史表可能有其他(更近期)行ActionTaken = 1,但我想捕获日期ActionTaken 变为 1.

例:

SELECT  MIN(LogDate) AS FirstActionDate
FROM    HistoryTable
WHERE   ID = 123
    AND FirstActionTaken = 1

SELECT  MIN(LogDate) AS SecondActionDate
FROM    HistoryTable
WHERE   ID = 123
    AND SecondActionTaken = 1

SELECT  MIN(LogDate) AS ThirdActionDate
FROM    HistoryTable
WHERE   ID = 123
    AND ThirdActionTaken = 1
Run Code Online (Sandbox Code Playgroud)

这很好用,我收到了正确的日期没有问题.当我遇到麻烦,然后要selectMAX(LogDate)从该组:

SELECT  MAX(LogDate) AS LastActionDate
FROM    HistoryTable
WHERE   ID = 123
    AND LogDate IN 
    (
            (   SELECT  MIN(LogDate) …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

6
推荐指数
1
解决办法
107
查看次数