Sql server 2012 同一表中的大量内部联接

Sql server 2012 同一表中的大量内部联接,sql-server-2012,Sql Server 2012,我有一个场景,其中所有项目都位于一个名为“table”的表中。我这样做是为了两件事: SELECT I.A + J.A AS A, I.B + J.B AS B, I.C + J.C AS C FROM table AS I INNER JOIN Table AS J ON I.StartDate = J.StartDate AND I.EndDate = J.EndDate WHERE I.ItemId = 602028 AND J.ItemId = 602029 我对表中的三个项目执

我有一个场景,其中所有项目都位于一个名为“table”的表中。我这样做是为了两件事:

SELECT I.A + J.A AS A, I.B + J.B AS B, I.C + J.C AS C FROM table AS I
INNER JOIN Table AS J
ON I.StartDate = J.StartDate
AND I.EndDate  = J.EndDate
WHERE I.ItemId = 602028
AND   J.ItemId = 602029
我对表中的三个项目执行此操作:

SELECT I.A + J.A + K.A AS A, I.B + J.B + K.B AS B, I.C + J.C + K.C AS C FROM table AS I
INNER JOIN Table AS J
   ON I.StartDate = J.StartDate
  AND I.EndDate   = J.EndDate
INNER JOIN Table AS K
   ON I.StartDate = K.StartDate
  AND I.EndDate   = K.EndDate
WHERE I.ItemId    = 602028
  AND J.ItemId    = 602029
  AND K.ItemId    = 602030
现在你知道我想做什么了;直截了当的问题就在这里。要加入的项目数是在运行时提供的,这个数字可能很大,最多可达200个。我的问题是:最有效的方法是什么?目前,在超过5次连接时,它开始变得丑陋。

请尝试此功能

Select sum(a)as A, sum(b) as B,sum(c) as C from
(select itemid,a,b,c from table t 
where itemid in (602028,602029,...) 
    and exists (select 'x' from table t1 where itemid in (602028,602029,...) and t.startdate=t1.startdate and t.enddate=t1.enddate))a

您可以尝试对派生表中的表进行并集,并对所选日期和项目的列使用sum()


现在您只需在派生表中合并新表。

不确定为什么要使用别名和透视,因为我认为您不需要它

要尝试的示例

declare @table table (ID int, A int, B int, C int, startdate date, enddate date)

insert @table (ID, A, B, C, startdate, enddate)
select 123, 1, 1, 1, '2014-10-10', '2014-10-10'
union all
select 456,2, 2, 2, '2014-10-10', '2014-10-10'
union all
select 789,3, 3, 3, '2014-10-10', '2014-10-10'
union all
select 111,4, 4, 4, '2014-10-11', '2014-10-11'
union all
select 222,4, 4, 4, '2014-10-11', '2014-10-11'


select sum(A) as A, sum(B) as B, sum(C) as C, startdate, enddate
from @table
where ID in (123,456,789, 111, 222)
group by startdate, enddate

我认为你的第二个例子应该更新为第三个项目,如果没有错的话。你总是提前知道从第一个条目到最后一个条目涉及多少“跳跃”吗?它们是否总是像本例中那样连续?@Anand是的,我遗漏了J.ItemId=602029@Joachim是的,例如,用户提供了10个项目,因此我必须加入所有10个项目,但是如果我没有弄错的话,
J.itemid
在哪里。从前面的注释来看,所有10个项目都是相同的表。表名是“table”这里只涉及一个表,对应的列是每个项目的总和,而不是简单的标量乘法…请参考我的更新答案,同时我尝试表单查询youpivot看起来像是一种方式…必须考虑一下
declare @table table (ID int, A int, B int, C int, startdate date, enddate date)

insert @table (ID, A, B, C, startdate, enddate)
select 123, 1, 1, 1, '2014-10-10', '2014-10-10'
union all
select 456,2, 2, 2, '2014-10-10', '2014-10-10'
union all
select 789,3, 3, 3, '2014-10-10', '2014-10-10'
union all
select 111,4, 4, 4, '2014-10-11', '2014-10-11'
union all
select 222,4, 4, 4, '2014-10-11', '2014-10-11'


select sum(A) as A, sum(B) as B, sum(C) as C, startdate, enddate
from @table
where ID in (123,456,789, 111, 222)
group by startdate, enddate