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) 我想转换使用交叉应用到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) 这个问题是基于我以前的问题.我需要扩展查询,以便我可以合并另外两个表(在另一个服务器实例上运行).
在这个小提琴我添加了这两个表:
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) 我在下面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) 在一个单独的线程中,我得到了一个关于如何将我的存储过程转换为视图的工作示例,它将客户名称保存到订单映射,其中订单是逗号分隔的订单列表,包括无订单的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) 我有以下表格结构.
我只想将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)
我想更新
SUBID的RawLineNumber与A100 2和3,
SUBID的RawLineNumber 11与A200,
SUBID的RawLineNumber 26和27架A300.
我有一个光标可以完成这项工作但是我可以用CTE来处理它吗?
t-sql sql-server-2005 cursor common-table-expression cross-apply
我正在阅读一篇关于使用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) 我有这张桌子:
;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:
我想到的一个非智能解决方案是创建一个Times为n参数创建行的udf - 然后在Cross Apply我只做:select*from …
我有一系列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) 我想使用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)
输出:
结果应该是这样的:
cross-apply ×10
sql-server ×8
t-sql ×6
sql ×5
cursor ×1
json ×1
nul ×1
oracle11g ×1
pivot ×1
sql-view ×1