标签: cross-apply

疯狂的SQL问题:如何使用数据透视交叉应用?

客户的数据中有快捷方式,他们在一个字段中有大量记录.当我解析它们时,我需要制作记录,每个数量一个,将"标识符"增加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 …

sql pivot cross-apply

8
推荐指数
1
解决办法
844
查看次数

由CROSS APPLY触发时的顺序SQL插入

此过程有几个步骤,这些步骤反映在数据库的各个表中:

生产 - > 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)

t-sql sql-server cross-apply

8
推荐指数
1
解决办法
914
查看次数

为什么交叉应用比内连接更快?

我有以下功能:

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和 …

t-sql performance inner-join cross-apply sql-server-2012

7
推荐指数
1
解决办法
2493
查看次数

为什么CROSS APPLY * not *在此查询中没有得到无效的列错误?

我正在编写一些代码来查询某些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)

t-sql sql-server cross-apply

7
推荐指数
1
解决办法
47
查看次数

使用CTE简化SQL语句

我有如下查询:

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...这么多次?

sql common-table-expression sql-server-2008 cross-apply

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

什么时候选择CROSS APPLY和EXISTS?

我读过,CROSS APPLY就像JOIN ..我认为JOIN也可以用EXISTS完成(相关子查询)

我很困惑,使用CROSS APPLY和EXISTS有什么区别?

什么时候应该去交叉申请反对EXISTS?

sql sql-server join exists cross-apply

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

按列名连接表,将字符串转换为列名

我有一张桌子,每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)

t-sql sql-server pivot cross-apply

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

TSQL可以使用命名行进行多列unpivot?

我知道这里有几个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.

输出意图是这样的: …

t-sql sql-server unpivot cross-apply sql-server-2014

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

如何在CROSS APPLY [SQL Server]中处理空行

我在下面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)

sql sql-server sql-server-2008 cross-apply nul

5
推荐指数
1
解决办法
4812
查看次数

创建笛卡尔积时,CROSS APPLY和OUTER APPLY之间有什么区别吗?

当两个表之间创建一个笛卡尔积,有什么区别CROSS APPLYOUTER 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)

t-sql sql-server cross-apply outer-apply

5
推荐指数
1
解决办法
620
查看次数