使用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 Server 2005中的更新语句的from部分中使用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是一个表值函数.我不能放置这个函数的代码,因为它真的很大,它会使一些困难的计算,我不能放弃它.
在下面的例子中,我试图根据每个酒吧位置的可用性来计算我可以制作的饮料数量.
进一步澄清,如下例所示:基于下图中突出显示的数字; 我知道我只能在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) 我想在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语句的方法?
我有一个可变大小的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
我想为Entity Framework查询创建一些测试用例,这些测试确实生成包含CROSS APPLY或OUTER APPLY运算符的SQL命令.
有人可以显示出现这些SQL查询的典型场景吗?
我试图获取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) 我对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_TABLE并ANOTHER_TABLE只返回一行或几行.我的问题:
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) 我需要在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) cross-apply ×10
sql-server ×6
sql ×4
performance ×3
outer-apply ×2
.net ×1
join ×1
lateral ×1
linq ×1
linq-to-sql ×1
mysql ×1
parent-child ×1
postgresql ×1
restriction ×1
sql-update ×1
sqlxml ×1
subquery ×1
t-sql ×1
xml ×1