标签: cross-apply

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

使用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万
查看次数

在更新语句中使用交叉应用

是否可以在SQL Server 2005中的更新语句的from部分中使用cross apply子句?

sql-server sql-server-2005 cross-apply sql-update

21
推荐指数
1
解决办法
2万
查看次数

Postgres类似于SQL Server中的CROSS APPLY

我需要将为MS SQL Server 2005编写的SQL查询迁移到Postgres 9.1.在此查询中
替换的最佳方法是什么CROSS APPLY

SELECT *
FROM V_CitizenVersions         
CROSS APPLY     
       dbo.GetCitizenRecModified(Citizen, LastName, FirstName, MiddleName,
BirthYear, BirthMonth, BirthDay, ..... ) -- lots of params
Run Code Online (Sandbox Code Playgroud)

GetCitizenRecModified()function是一个表值函数.我不能放置这个函数的代码,因为它真的很大,它会使一些困难的计算,我不能放弃它.

sql postgresql cross-apply postgresql-9.1 lateral

16
推荐指数
2
解决办法
2万
查看次数

父母计数基于多个孩子的配对

在下面的例子中,我试图根据每个酒吧位置的可用性来计算我可以制作的饮料数量.

进一步澄清,如下例所示:基于下图中突出显示的数字; 我知道我只能在6/30/2018制作1玛格丽塔(如果我将物资运到该地点,则在DC或FL中).

数据表的样本

按位置组按饮料分类的库存样本图表

请使用以下代码输入上面的相关数据:

    CREATE TABLE #drinks 
    (
        a_date      DATE,
        loc         NVARCHAR(2),
        parent      NVARCHAR(20),
        line_num    INT,
        child       NVARCHAR(20),
        avail_amt   INT
    );

INSERT INTO #drinks VALUES ('6/26/2018','CA','Long Island','1','Vodka','7');
INSERT INTO #drinks VALUES ('6/27/2018','CA','Long Island','2','Gin','5');
INSERT INTO #drinks VALUES ('6/28/2018','CA','Long Island','3','Rum','26');
INSERT INTO #drinks VALUES ('6/26/2018','DC','Long Island','1','Vodka','15');
INSERT INTO #drinks VALUES ('6/27/2018','DC','Long Island','2','Gin','18');
INSERT INTO #drinks VALUES ('6/28/2018','DC','Long Island','3','Rum','5');
INSERT INTO #drinks VALUES ('6/26/2018','FL','Long Island','1','Vodka','34');
INSERT INTO #drinks VALUES ('6/27/2018','FL','Long Island','2','Gin','14');
INSERT INTO #drinks VALUES ('6/28/2018','FL','Long Island','3','Rum','4');
INSERT INTO #drinks VALUES …
Run Code Online (Sandbox Code Playgroud)

sql sql-server parent-child cross-apply outer-apply

15
推荐指数
1
解决办法
310
查看次数

LINQ to SQL交叉应用

我想在LINQ中创建一个带有交叉应用的查询到用户定义的表值函数.SQL将非常简单,如下所示:

SELECT *
FROM MyTable mt
CROSS APPLY MyTVF(mt.id)
Run Code Online (Sandbox Code Playgroud)

这篇文章给出了一个LINQ查询示例,该查询导致生成的sql既包含交叉应用又包含外部应用,但仅用于不用于tvf的子查询. 文章证实,LINQ to SQL中会产生交叉应用和外部应用运营商"的关系导航"但我不知道是什么,在这里指. 这个post描述了我想要做的事情,答案说这样做的唯一方法是将SQL查询包装在存储过程中,然后通过LINQ调用sp.我希望这不是真的,因为我实际上需要一个可以在多个LINQ查询中的应用程序中使用这种方式的tvf,因此"将它包装在sp中"对我来说不起作用.有没有人知道通过LINQ获得类似上面的简单SQL语句的方法?

.net linq linq-to-sql cross-apply

11
推荐指数
1
解决办法
5078
查看次数

随着xml文档的增长,交叉应用xml查询的性能呈指数级下降

是)我有的

我有一个可变大小的XML文档,需要在MSSQL 2008 R2上解析,如下所示:

<data item_id_type="1" cfgid="{4F5BBD5E-72ED-4201-B741-F6C8CC89D8EB}" has_data_event="False">
  <item name="1">
    <field id="{EA032B25-19F1-4C1B-BDDE-3113542D13A5}" type="2">0.506543009706267</field>
    <field id="{71014ACB-571B-4C72-9C9B-05458B11335F}" type="2">-0.79500402346138</field>
    <field id="{740C36E9-1988-413E-A1D5-B3E5B4405B45}" type="2">0.0152649050024924</field>
  </item>
  <item name="2">
    <field id="{EA032B25-19F1-4C1B-BDDE-3113542D13A5}" type="2">0.366096802804087</field>
    <field id="{71014ACB-571B-4C72-9C9B-05458B11335F}" type="2">-0.386642801354842</field>
    <field id="{740C36E9-1988-413E-A1D5-B3E5B4405B45}" type="2">0.031671174184115</field>
  </item>
</data>
Run Code Online (Sandbox Code Playgroud)

.

我想要的是

我需要将其转换为常规表类型数据集,如下所示:

item_name field_id                             field_type  field_value
--------- ------------------------------------ ----------- ---------------
1         EA032B25-19F1-4C1B-BDDE-3113542D13A5 2           0.5065430097062
1         71014ACB-571B-4C72-9C9B-05458B11335F 2           -0.795004023461
1         740C36E9-1988-413E-A1D5-B3E5B4405B45 2           0.0152649050024
2         EA032B25-19F1-4C1B-BDDE-3113542D13A5 2           0.3660968028040
2         71014ACB-571B-4C72-9C9B-05458B11335F 2           -0.386642801354
2         740C36E9-1988-413E-A1D5-B3E5B4405B45 2           0.0316711741841
3         EA032B25-19F1-4C1B-BDDE-3113542D13A5 2           0.8839620369590
3         71014ACB-571B-4C72-9C9B-05458B11335F 2           -0.781459993268
3         740C36E9-1988-413E-A1D5-B3E5B4405B45 2           0.2284423515729 …
Run Code Online (Sandbox Code Playgroud)

sql-server performance sqlxml sql-server-2008-r2 cross-apply

11
推荐指数
1
解决办法
9960
查看次数

实体框架和CROSS/OUTER应用

我想为Entity Framework查询创建一些测试用例,这些测试确实生成包含CROSS APPLY或OUTER APPLY运算符的SQL命令.

有人可以显示出现这些SQL查询的典型场景吗?

sql sql-server entity-framework cross-apply outer-apply

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

获取XML字段XQuery SQL Server 2008中的节点数

我试图获取XML字段中的节点数.但我总是看到0结果.这是我的查询的样子.


 DECLARE @XmlTable TABLE (XmlResult XML)
INSERT INTO @XmlTable EXECUTE [dbo].usp_GetBooks @EditionId=400
--select * from  @XmlTable
SELECT
--Count number of nodes
  COUNT(*) AS BooksCount
FROM
(
SELECT XmlResult FROM @XmlTable
) AS XmlTable(XmlColumn)
CROSS APPLY XmlColumn.nodes('./books/book') XmlTableFunction(XmlColumn2);
Run Code Online (Sandbox Code Playgroud)

我的XML看起来像:

<Version number ="1"> 
<books>
<book>
  <name> </name>
  <author></author>
</book>
<book>
  <name> </name>
  <author></author>
</book>
</books>
</Version>
Run Code Online (Sandbox Code Playgroud)

xml sql-server-2008 cross-apply

9
推荐指数
1
解决办法
4万
查看次数

CROSS APPLY具有表值函数限制性能

我对CROSS APPLY参数化表值函数有问题.这是简化的伪代码示例:

SELECT * 
FROM (
    SELECT lor.*
    FROM LOT_OF_ROWS_TABLE lor
    WHERE ...
) AS lor
CROSS APPLY dbo.HeavyTableValuedFunction(lor.ID) AS htvf
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID 
WHERE ...
Run Code Online (Sandbox Code Playgroud)
  • 表上的内部选择LOT_OF_ROWS_TABLE返回许多行.
  • 连接表LOT_OF_ROWS_TABLEANOTHER_TABLE只返回一行或几行.
  • 表值函数非常耗时,并且在调用大量行时,select会持续很长时间.

我的问题:

LOT_OF_ROWS_TABLE无论在加入时数据是否受限这一事实,都会为所有返回的行调用该函数ANOTHER_TABLE.

选择必须采用所示的格式 - 它是生成的,实际上它更加困难.

当我尝试重写它时,它可以非常快,但它不能像这样重写:

SELECT * 
FROM (
    SELECT lor.*
    FROM LOT_OF_ROWS_TABLE lor
    WHERE ...
) AS lor
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID 
CROSS APPLY dbo.HeavyTableValuedFunction(at.ID) AS htvf …
Run Code Online (Sandbox Code Playgroud)

sql-server performance restriction cross-apply

9
推荐指数
1
解决办法
4万
查看次数

在MySQL中交叉/外部应用

我需要在MySQL中使用CROSS APPLY(EC2 RDS MySQL实例).看起来MySQL无法识别CROSS APPLY语法.有谁可以帮助我吗?

这是查询.

SELECT ORD.ID
    ,ORD.NAME
    ,ORD.DATE
    ,ORD_HIST.VALUE
FROM ORD
CROSS APPLY (
    SELECT TOP 1 ORD_HISTORY.VALUE
    FROM ORD_HISTORY
    WHERE ORD.ID = ORD_HISTORY.ID
        AND ORD.DATE <= ORD_HISTORY.DATE
    ORDER BY ORD_HISTORY.DATE DESC
    ) ORD_HIST
Run Code Online (Sandbox Code Playgroud)

mysql join subquery cross-apply

9
推荐指数
3
解决办法
3万
查看次数