Sql server 从涉及两个其他日期之间的日期的查询中删除子查询

Sql server 从涉及两个其他日期之间的日期的查询中删除子查询,sql-server,tsql,Sql Server,Tsql,我有两张桌子第一张是这样叫这张桌子 另一个表是这样的调用这个表DataAndCreatedOn 现在我有一个这样的问题 Select sed.someotherdata , (select sum(data) from DataAndCreatedOn where CreatedOn between sed.StartDate and sed.EndDate) as total from StartEndDates sed 有没有办法摆脱子查询sele

我有两张桌子第一张是这样叫这张桌子

另一个表是这样的调用这个表DataAndCreatedOn

现在我有一个这样的问题

Select sed.someotherdata
    , (select sum(data) 
       from DataAndCreatedOn 
       where CreatedOn between sed.StartDate and sed.EndDate) as total 
from StartEndDates sed
有没有办法摆脱子查询select sumdata from DATA和CreatedOn,其中CreatedOn介于sed.StartDate和sed.EndDate之间,作为总计并以某种方式将其作为联接?

您可以通过以下方式使用联接和组:


但是,StartEndDates的行将被分组。如果您在其他数据上有重复的值,则与原始查询相比,您可能会得到较少的行。

如果您确实想删除该子查询,也可以使用交叉应用,尽管执行计划几乎相同。正如@EzLo所指出的,正如您将从我的示例中看到的,如果您有重复的其他数据,它将根据您是否执行左连接或交叉应用来更改您的结果。因此,这取决于您希望从查询中得到什么。我还要注意查询性能:

CREATE TABLE #StartEndDates(StartDate  date, EndDate  date, SomeOtherData varchar(100))
CREATE TABLE #DateAndCreatedOn(Data decimal(10,4), CreatedOn date)

INSERT INTO #StartEndDates VALUES('2018-09-08', '2018-09-23', 'data 1')
INSERT INTO #StartEndDates VALUES('2018-07-08', '2018-08-01', 'data 2')
INSERT INTO #StartEndDates VALUES('2018-07-21', '2018-08-12', 'data 3')

--INSERT THIS ROW TO SEE DUPLICATE SomeOtherData
INSERT INTO #StartEndDates VALUES('2018-07-11', '2018-08-12', 'data 3')


INSERT INTO #DateAndCreatedOn VALUES(1.5,'2018-09-20')
INSERT INTO #DateAndCreatedOn VALUES(2.4,'2018-07-15')
INSERT INTO #DateAndCreatedOn VALUES(3.5,'2018-07-21')



--ORIGINAL QUERY
 Select sed.someotherdata
    , (select sum(data) 
       from #DateAndCreatedOn 
       where CreatedOn between sed.StartDate and sed.EndDate) as total 
from #StartEndDates sed


--LEFT JOIN QUERY
SELECT
    sed.someotherdata,
    SUM(d.data) as total
FROM
    #StartEndDates sed
    LEFT JOIN #DateAndCreatedOn d ON d.CreatedOn BETWEEN sed.StartDate and sed.EndDate
GROUP BY
    sed.someotherdata


--CROSS APPLY QUERY
 SELECT sed.SomeOtherData, x.SM
 FROM #StartEndDates sed
 CROSS APPLY (SELECT SUM(Data) SM  from #DateAndCreatedOn d where d.CreatedOn between sed.StartDate and sed.EndDate) x

Ezlo提供了答案和警告。仔细考虑一下这个警告。当前查询返回StartEndDates中的每一行,即使有多行包含someotherdata的相同值。
Select sed.someotherdata
    , (select sum(data) 
       from DataAndCreatedOn 
       where CreatedOn between sed.StartDate and sed.EndDate) as total 
from StartEndDates sed
SELECT
    sed.someotherdata,
    SUM(d.data) as total
FROM
    StartEndDates sed
    LEFT JOIN DataAndCreatedOn d ON d.CreatedOn BETWEEN sed.StartDate and sed.EndDate
GROUP BY
    sed.someotherdata
CREATE TABLE #StartEndDates(StartDate  date, EndDate  date, SomeOtherData varchar(100))
CREATE TABLE #DateAndCreatedOn(Data decimal(10,4), CreatedOn date)

INSERT INTO #StartEndDates VALUES('2018-09-08', '2018-09-23', 'data 1')
INSERT INTO #StartEndDates VALUES('2018-07-08', '2018-08-01', 'data 2')
INSERT INTO #StartEndDates VALUES('2018-07-21', '2018-08-12', 'data 3')

--INSERT THIS ROW TO SEE DUPLICATE SomeOtherData
INSERT INTO #StartEndDates VALUES('2018-07-11', '2018-08-12', 'data 3')


INSERT INTO #DateAndCreatedOn VALUES(1.5,'2018-09-20')
INSERT INTO #DateAndCreatedOn VALUES(2.4,'2018-07-15')
INSERT INTO #DateAndCreatedOn VALUES(3.5,'2018-07-21')



--ORIGINAL QUERY
 Select sed.someotherdata
    , (select sum(data) 
       from #DateAndCreatedOn 
       where CreatedOn between sed.StartDate and sed.EndDate) as total 
from #StartEndDates sed


--LEFT JOIN QUERY
SELECT
    sed.someotherdata,
    SUM(d.data) as total
FROM
    #StartEndDates sed
    LEFT JOIN #DateAndCreatedOn d ON d.CreatedOn BETWEEN sed.StartDate and sed.EndDate
GROUP BY
    sed.someotherdata


--CROSS APPLY QUERY
 SELECT sed.SomeOtherData, x.SM
 FROM #StartEndDates sed
 CROSS APPLY (SELECT SUM(Data) SM  from #DateAndCreatedOn d where d.CreatedOn between sed.StartDate and sed.EndDate) x