标签: cross-apply

SQL Server交叉应用不起作用?

http://sqlfiddle.com/#!3/78273/1

create table emptb1
(
id int,
name varchar(20),
dept int
)

insert into emptb1 values (1,'vish',10);
insert into emptb1 values (2,'vish',10);
insert into emptb1 values (3,'vish',30);
insert into emptb1 values (4,'vish',20);

create table depttb1
(
id int,
name varchar(20)
)

insert into depttb1 values(10,'IT')
insert into depttb1 values(20,'AC')
insert into depttb1 values(30,'LIC')

select * from emptb1

select e.id, e.name, a.id
from emptb1 e
cross apply
(
select top 1 * from depttb1 d
where d.id = e.dept
order by …
Run Code Online (Sandbox Code Playgroud)

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

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

转换T-SQL交叉应用到Oracle

我想转换使用交叉应用到Oracle 11g的SQL Server(T-SQL)查询.Oracle在12g之前不支持Cross Apply,因此我必须找到解决方法.查询背后的想法是每个Tab.Name ='Foobar',我需要找到前一行的名称,其名称由Tab.Date排序.(此表包含具有不同名称和日期的1个ID的多行).

这是T-SQL代码:

SELECT DISTINCT t1.ID
                t1.Name, 
                t1.Date, 
                t2.Date as 'PreviousDate',
                t2.Name as 'PreviousName'
FROM  Tab t1 
               OUTER apply (SELECT TOP 1 t2.Date, 
                                         t2.Name 
                            FROM  Tab t2 
                            WHERE  t1.Id = t2.Id 

                            ORDER BY t2.Date DESC) t2 
WHERE  t1.Name = 'Foobar' )
Run Code Online (Sandbox Code Playgroud)

从技术上讲,我能够使用LEFT JOIN和LAG()函数在Oracle中重新创建相同的功能:

SELECT DISTINCT t1.ID
            t1.Name, 
            t1.Date, 
            t2.PreviousDate as PreviousDate,
            t2.PreviousName as PreviousName
FROM   Tab t1  
          LEFT JOIN (
                SELECT ID,
                LAG(Name) OVER (PARTITION BY ID ORDER BY PreviousDate) as PreviousName,
                LAG(Date) OVER (PARTITION BY ID …
Run Code Online (Sandbox Code Playgroud)

sql-server oracle11g cross-apply

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

TSQL - 扩展由交叉应用和数据透视组成的查询

这个问题是基于我以前的问题.我需要扩展查询,以便我可以合并另外两个表(在另一个服务器实例上运行).

在这个小提琴我添加了这两个表:

CREATE TABLE LookUp
 ([docID] varchar(10), [docType] varchar(100), [PartNumber] varchar(100), [internalID] varchar(100));
INSERT INTO LookUp
 ([docID],[docType],[PartNumber], [internalID])
VALUES
  ('D0305415', 'docTypeSub', 'X0455', null),
  ('D0157632', 'docTypeMain', null, 'XY05570-XY05571'),
  ('D0181511', 'docTypeMain',null, 'XY05572-XY05573'),
  ('D0157633', 'docTypeMain', null, 'XY06380-XY06381'),
  ('D0156037', 'docTypeSub', 'X0326', null),
  ('D0151874', 'docTypeMain', null, 'XY05345');

CREATE TABLE Links
  ([docIDTop] varchar(10), [docIDBottom] varchar(10));
INSERT INTO Links
  ([docIDTop],[docIDBottom])
VALUES
  ('D0157632', 'D0305415'),
  ('D0181511', 'D0305415'),
  ('D0157633', 'D0305415'),
  ('D0151874', 'D0156037');
Run Code Online (Sandbox Code Playgroud)

关于输出,我需要根据PartNumber列在逗号分隔列中显示新的internalID列.

这是输出正确数据的查询:

 select c.docType AS c_docTypeSub, c.docID AS …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server pivot cross-apply

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

如何在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重写为INNER JOIN以使视图编入索引

在一个单独的线程中,我得到了一个关于如何将我的存储过程转换为视图的工作示例,它将客户名称保存到订单映射,其中订单是逗号分隔的订单列表,包括无订单的NULL.因此,对于下表,我需要在视图中显示以下内容:

Name     Orders
'John'   New Hat, New Book, New Phone
'Marry'  NULL
Run Code Online (Sandbox Code Playgroud)

我需要索引视图,但如果视图中的SELECT查询具有APPLY和/或子查询,则无法执行此操作.是否可以将此视图转换为索引视图?

create table Customers (CustomerId int, CustomerName VARCHAR(100))
create table Orders    (CustomerId int, OrderName VARCHAR(100))

insert into Customers  (CustomerId, CustomerName) select 1, 'John' union all select 2, 'Marry'
insert into Orders     (CustomerId, OrderName)    select 1, 'New Hat' union all select 1, 'New Book' union all select 1, 'New Phone'
go

create view OrderView as 
select c.CustomerName, x.OrderNames        
from Customers c            
cross apply (select stuff((select ',' + …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server cross-apply sql-view

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

使用CTE而不是Cursor

我有以下表格结构.

我只想将SubId更新为其为null的所有行,其中RawLineNumber以1 递增,SeqNumber以1递增.

RawlineNumber Claimid SubId SeqNumber
1             6000    A100  1
2             6000    NULL  2
3             6000    NULL  3
10            6000    A200  1
11            6000    NULL  2
25            6000    A300  1
26            6000    NULL  2
27            6000    NULL  3
Run Code Online (Sandbox Code Playgroud)

我想更新
SUBIDRawLineNumber与A100 2和3,
SUBIDRawLineNumber 11与A200,
SUBIDRawLineNumber 26和27架A300.

我有一个光标可以完成这项工作但是我可以用CTE来处理它吗?

t-sql sql-server-2005 cursor common-table-expression cross-apply

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

SQL Server的指南APPLY AND JOIN关键字

我正在阅读一篇关于使用apply & join关键字的文章.查看一些SQL,其中一个示例使用内部联接和其他使用apply关键字.

这是表pic

在此输入图像描述

SELECT E.EMPID, E.NAME, E.DEPTID, D.NAME 
FROM EMPLOYEE E 
INNER JOIN  DEPARTMENT D ON E.DEPTID = D.DEPTID

SELECT E.EMPID, E.NAME, E.DEPTID, CA.NAME 
FROM EMPLOYEE E
CROSS APPLY
    (SELECT * FROM DEPARTMENT D WHERE D.DEPTID = E.DEPTID) CA  
Run Code Online (Sandbox Code Playgroud)

两个查询都返回相同的输出和相同的执行计划.这是照片

在此输入图像描述 在此输入图像描述

再次使用外部应用和左外部连接

SELECT E.EMPID, E.NAME, E.DEPTID, D.NAME 
FROM EMPLOYEE E 
LEFT JOIN  DEPARTMENT D ON E.DEPTID = D.DEPTID

SELECT E.EMPID, E.NAME, E.DEPTID, OA.NAME 
FROM EMPLOYEE E
OUTER APPLY
    (SELECT * FROM DEPARTMENT D WHERE D.DEPTID = E.DEPTID) OA …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server cross-apply

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

如何将Cross Apply用于多行?

我有这张桌子:

;WITH cte AS (
    SELECT Name='john' , Times=1    
    UNION ALL
    SELECT 'paul' ,2
    UNION ALL
    SELECT 'george' , 3
    UNION ALL
    SELECT 'ringo' , 1
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想显示每一行,Times时间:

John 1
Paul 2
Paul 2
george 3
george 3
george 3
ringo 1
Run Code Online (Sandbox Code Playgroud)

所以我知道如果我这样写Cross apply:

SELECT *
FROM   cte
       CROSS APPLY(
        SELECT 1 AS ca
        UNION 
        SELECT 2
       ) y
Run Code Online (Sandbox Code Playgroud)

然后每行将显示2次.

在此输入图像描述

但我不想要2次.我想要Times时间

如何增强查询功能呢?

nb:

我想到的一个非智能解决方案是创建一个Timesn参数创建行的udf - 然后在Cross Apply我只做:select*from …

sql-server cross-apply

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

OPENJSON交叉应用NULL值(TSQL)

我有一系列OPENJSON语句,在我的存储过程的最后一步,我从倒数第二个表中的最后一列解析一些JSON.最后一列几乎总是空的,但它是从JSON对象填充的,因此它偶尔会有一些信息.我试图将表1转换为FinalTable,如下所示:

Table 1
Col1  Col2  Col3  Col4  Col5  Col6  Col7  Adjustments
123   592   593   data  rand  fake  data  []
345   035   021   ll    need  food  now   [ { "id": 999, "adj1": 123 }]

FinalTable
Col1  Col2  Col3  Col4  Col5  Col6  Col7  AdjID  Adj1  Adj2  Adj3
123   592   593   data  rand  fake  data  NULL   NULL  NULL  NULL
345   035   021   ll    need  food  now   999    123   NULL  NULL
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

INSERT into FinalTable ([Col1], [Col2], [Col3], [Col4], [Col5], [Col6], [Col7], [AdjID], [Adj1], …
Run Code Online (Sandbox Code Playgroud)

sql t-sql json cross-apply

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

如何在SQL Server 2012中使用CROSS APPLY对列进行拆分

我想使用CROSS APPLY来UNPIVOT多列.

CGL, CPL, EO应该变为Coverage Type,值CGL, CPL, EO应该在列中Premium,值CGLTria,CPLTria,EOTria应该在列中Tria Premium

declare @TestDate table  ( 
                            QuoteGUID varchar(8000), 
                            CGL money, 
                            CGLTria money, 
                            CPL money,
                            CPLTria money,
                            EO money,
                            EOTria money
                            )

INSERT INTO @TestDate (QuoteGUID, CGL, CGLTria, CPL, CPLTria, EO, EOTria)
VALUES ('2D62B895-92B7-4A76-86AF-00138C5C8540', 2000, 160, 674, 54, 341, 0),
       ('BE7F9483-174F-4238-8931-00D09F99F398', 0, 0, 3238, 259, 0, 0),
       ('BECFB9D8-D668-4C06-9971-0108A15E1EC2', 0, 0, 0, 0, 0, 0)

SELECT * FROM @TestDate
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

结果应该是这样的:

在此输入图像描述

t-sql sql-server cross-apply sql-server-2012

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