客户的数据中有快捷方式,他们在一个字段中有大量记录.当我解析它们时,我需要制作记录,每个数量一个,将"标识符"增加7天(因为数字表示日期.
例如:单个产品销售四周,我需要四个记录,每周一件产品.
[Event Number]
[Classification]
[Weeks Running]
[Some Data]
2009 11 29 00
1
1
runs one week
2009 12 06 00
2
1
runs one week
2009 12 13 00
1
4
runs four weeks
2009 12 20 00
2
4
runs four weeks
不知何故,我需要将这些数据转换为以下视图(sql select)(所有在同一个表中,包含空格以查看部分:
[Event Number + Classification]
[Some Data]
2009 11 29 01
runs for one week 一周就有一个记录.
2009 12 06 02
runs for one week
2009 12 13 01
runs for four weeks …
此过程有几个步骤,这些步骤反映在数据库的各个表中:
生产 - > UPDATE使用类似的东西到库存表
UPDATE STOR SET
STOR.BLOC1 = T.BLOC1,
STOR.BLOC2 = T.BLOC2,
STOR.BLOC3 = T.BLOC3,
STOR.PRODUCTION = T.PROD,
STOR.DELTA = T.DELTA
FROM BLDG B INNER JOIN STOR S
ON S.B_ID = B.B_ID
CROSS APPLY dbo.INVENTORIZE(B.B_ID) AS T;
Run Code Online (Sandbox Code Playgroud)
上面提供了一个日志表,TRIGGER如下所示:
CREATE TRIGGER trgrCYCLE
ON STOR
FOR UPDATE
AS
INSERT INTO dbo.INVT
(TS, BLDG, PROD, ACT, VAL)
SELECT CURRENT_TIMESTAMP, B_ID, PRODUCTION,
CASE WHEN DELTA < 0 THEN 'SELL' ELSE 'BUY' END,
DELTA
FROM inserted WHERE COALESCE(DELTA,0) …Run Code Online (Sandbox Code Playgroud) 我有以下功能:
FunctionA - returns Object ID and Detail ID
FunctionB - returns Detail ID and Detail Name
Run Code Online (Sandbox Code Playgroud)
以下查询用于提取Object ID,Detail ID并且Detail Name:
SELECT FunctionA.ID
,FunctionA.DetailID
,FunctionB.DetailName
FROM FunctionA (...)
INNER JOIN FunctionB (...)
ON FunctionA.DetailID = FunctionB.DetailID
Run Code Online (Sandbox Code Playgroud)
下面的屏幕截图显示了其执行计划成本(需要32秒):

在下面的查询我已经改变了使用的查询cross apply ,而不是inner join搞得FunctionB返回Detail Name特定的Detail ID:
SELECT FunctionA.ID
,FunctionA.DetailID
,FunctionB.DetailName
FROM FunctionA (...)
CROSS APPLY FunctionB (FunctionA.DetailID)
ON FunctionA.DetailID = FunctionB.DetailID
Run Code Online (Sandbox Code Playgroud)
下面的屏幕截图显示了其执行计划成本(需要3秒):

在第一种情况下FunctionB返回所有对Detail ID和 …
我正在编写一些代码来查询某些DMV。根据SQL版本,DMV中某些列可能存在也可能不存在。我在网上找到了一个有趣的建议,如何跳过使用的特定检查CROSS APPLY。
以下查询是用于读取可能缺少的列的DMV的代码示例。该代码为该列创建默认值,并用于CROSS APPLY从DMV中提取实际列(如果存在)。
代码尝试提取的列BogusColumn不存在。我希望下面的查询会生成有关无效列名的错误...但事实并非如此。它返回NULL且没有错误。
为什么下面的CROSS APPLY子句不会导致“无效的列名”错误?
declare @x int
select @x = b.BogusColumn
from
(
select cast(null as int) as BogusColumn
) a
cross apply
(
select BogusColumn from sys.dm_exec_sessions
) b;
select @x;
Run Code Online (Sandbox Code Playgroud)
如果我分别运行查询CROSS APPLY:
select BogusColumn from sys.dm_exec_sessions;
Run Code Online (Sandbox Code Playgroud)
我收到有关无效列名的预期错误:
Msg 207, Level 16, State 1, Line 9
Invalid column name 'BogusColumn'.
Run Code Online (Sandbox Code Playgroud)
如果我将DMV列名更改为BogusColumn2以使其唯一,则会出现预期的列名错误:
select a.BogusColumn1, b.BogusColumn2
from
(
select cast(null as int) as BogusColumn1
) a
cross apply
(
select BogusColumn2 from …Run Code Online (Sandbox Code Playgroud) 我有如下查询:
SELECT A.a, A.b, B.c,
(CASE WHEN ... THEN ... ELSE ... END) AS CalculatedValue,
B.d
FROM dbo.TableA A INNER JOIN
dbo.TableB B ON (...)
WHERE (CASE WHEN ... THEN ... ELSE ... END) BETWEEN @DayStart AND @DayEnd
GROUP BY A.a, (CASE WHEN ... THEN ... ELSE ... END), B.c
Run Code Online (Sandbox Code Playgroud)
避免重复多次完全相同的表达式:(CASE WHEN ... THEN ... ELSE ... END)我想在select中定义一个CTE并查询这样的表,where和group by表达式CalculatedValue
不幸的是,这不起作用,因为选择需要已经包括group by创建时CTE
有没有其他方法可以用来不重复CASE WHEN...这么多次?
我读过,CROSS APPLY就像JOIN ..我认为JOIN也可以用EXISTS完成(相关子查询)
我很困惑,使用CROSS APPLY和EXISTS有什么区别?
什么时候应该去交叉申请反对EXISTS?
我有一张桌子,每1次调查可存储1行.
每项调查共收到约70个问题,每列提出1个问题
SurveyID Q1, Q2 Q3 .....
1 Yes Good Bad ......
Run Code Online (Sandbox Code Playgroud)
我想透镜调整,以便读取
SurveyID Question Answer
1 Q1 Yes
1 Q2 Good
1 Q3 Bad
... ... .....
Run Code Online (Sandbox Code Playgroud)
我使用{cross apply}来实现这个目标
SELECT t.[SurveyID]
, x.question
, x.Answer
FROM tbl t
CROSS APPLY
(
select 1 as QuestionNumber, 'Q1' as Question , t.Q1 As Answer union all
select 2 as QuestionNumber, 'Q2' as Question , t.Q2 As Answer union all
select 3 as QuestionNumber, 'Q3' as Question , t.Q3 As Answer) x …Run Code Online (Sandbox Code Playgroud) 我知道这里有几个unpivot/cross apply讨论,但我找不到任何涵盖我的问题的讨论.到目前为止我得到的是以下内容:
SELECT Perc, Salary
FROM (
SELECT jobid, Salary_10 AS Perc10, Salary_25 AS Perc25, [Salary_Median] AS Median
FROM vCalculatedView
WHERE JobID = '1'
GROUP BY JobID, SourceID, Salary_10, Salary_25, [Salary_Median]
) a
UNPIVOT (
Salary FOR Perc IN (Perc10, Perc25, Median)
) AS calc1
Run Code Online (Sandbox Code Playgroud)
现在,我想要添加其他几个列,例如.一个名为Bonus,我也想放入Perc10,Perc25和Median Rows.
作为替代方案,我也使用交叉应用进行了查询,但是在这里,似乎你不能像强制转换那样"强制"对行进行排序.换句话说,我不能有一个自定义排序,但只有一个根据表中的数字排序,如果我是正确的?至少,在这里我得到的结果就像我希望的那样,但是行的顺序是错误的,而且我没有像Perc10那样的行名称,这样会很好.
SELECT crossapplied.Salary,
crossapplied.Bonus
FROM vCalculatedView v
CROSS APPLY (
VALUES
(Salary_10, Bonus_10)
, (Salary_25, Bonus_25)
, (Salary_Median, Bonus_Median)
) crossapplied (Salary, Bonus)
WHERE JobID = '1'
GROUP BY crossapplied.Salary,
crossapplied.Bonus
Run Code Online (Sandbox Code Playgroud)
Perc在这里代表Percentile.
输出意图是这样的: …
我在下面Stored Procedure-
ALTER PROCEDURE [dbo].[Optimized_GetArticlePostAMP]
(
@PostID int
)
AS
BEGIN
SET NOCOUNT ON;
SET STATISTICS TIME ON
DECLARE @SectionId int ,@datediff int
DECLARE @postdate datetime
SELECT P.PostId, P.SectionID, P.PostName,MP.MetaTitle,P.Postdate,P.PostAuthor,P.IsApproved,
MP.Metadescription, MP.Metakeywords,ISNULL(MP.IsRobotsMetaTag,0) as IsRobotsMetaTag,p.TotalViews, P.Subject, P.FormattedBody,
MV.Isvideo,MV.VideoCode,MV.VideoCaption, A.DrComment,A.SpanishURL, PS.RedirectUrl, Isnull(PS.IsRedirect,0) as IsRedirect,
ISNULL(A.CommentedBy,38633) as CommentedBy ,MP.Canonical as Canonical,ISNULL(MP.RRpopUP ,0) as RRpopUP,ISNULL(A.PrevPost,0) as PreviousPostId,
ISNULL(A.NextPost,0) as NextPostId,PS.StatusId ,dbo.[mercola_GetCommentCountForPost](@PostId) as TotalReplies, isnull(PA.[FileName],'') as FileName,
PRD.StoryImage, PRD.StoryContent, ISNULL(NULLIF(prd.ALT, ''), P.Subject) AS ALT, ISNULL(PR.ReferenceData,'')as ReferenceData,
MH.LastModifiedDate,
CASE WHEN CHARINDEX('<p><strong>By', FormattedBody, -1)=1 THEN …Run Code Online (Sandbox Code Playgroud) 当两个表之间创建一个笛卡尔积,有什么区别CROSS APPLY和OUTER APPLY?
这似乎是一个愚蠢的问题,因为没有表之间表达的关系,右手表不能不满足关系,但我尊重我不知道的.
当我通过简单的测试设置查看执行计划时,它们是相同的[两个索引寻求进入嵌套循环(内部联接)],但简单的测试设置可能具有欺骗性.
这是我的意思的一个例子(SQL Fiddle).设置:
CREATE TABLE dbo.First (
Id INT IDENTITY(1, 1) PRIMARY KEY,
Name NVARCHAR(100)
);
GO
DECLARE @n INT = 1;
WHILE @n < 10000
BEGIN
INSERT INTO dbo.First (Name) VALUES ('First' + CONVERT(NVARCHAR(100), @n));
SET @n = @n + 1;
END
GO
CREATE INDEX IX__First__Name ON dbo.First(Name);
GO
CREATE TABLE dbo.Second (
Id INT IDENTITY(1, 1) PRIMARY KEY,
Name NVARCHAR(100)
);
GO
DECLARE @n INT = 1;
WHILE …Run Code Online (Sandbox Code Playgroud) cross-apply ×10
sql-server ×7
t-sql ×6
sql ×4
pivot ×2
exists ×1
inner-join ×1
join ×1
nul ×1
outer-apply ×1
performance ×1
unpivot ×1