加入两个临时表

时间:2014-09-29 22:14:26

标签: sql sql-server

我想将两个临时表连接到一个大临时表中。我想要第一个临时表中的所有记录,并且如果ProductID不存在于我的第一个临时表中,则只需要我的第二个临时表中的记录。

第一个临时表:

--define temporary table
declare @tmp table (
      ManagerID int null,
      ManagerName varchar(250),
      ProductID int null,
      ProductName varchar(250),
      RFIFixedIncomeAttributionID int null,
      Value decimal(8,4) null,
      Name varchar(250),
      Sector varchar(250)
      )

--populate temp table
insert into @tmp

select 
m.ManagerID, m.ManagerName, p.ID as 'ProductID', p.ProductName, sa.RFIFixedIncomeAttributionID, sa.Value, sc.Name,

case when gm.GeographicMandateID = 2 and s1.SubType1ID = 10 and s2.SubType2ID = 39 then 'Core'
    when gm.GeographicMandateID = 2 and s1.SubType1ID = 10 and s2.SubType2ID = 38 then 'Intermediate'
end as 'Sector'

from Products p

join Managers m on m.ManagerID = p.ManagerID
left join RFIFixedIncomeAttribution fia on fia.ParentID = p.ID and fia.ParentTypeID = 26
left join RFIFixedIncomeSectorAllocation sa on sa.RFIFixedIncomeAttributionID = fia.ID
    and sa.RFIFixedIncomeDataTypeID = 1
join RFIFixedIncomeSectorCategories sc on sc.ID = sa.RFIFixedIncomeSectorCategoryID
join SubType1 s1 on s1.SubType1ID = p.SubType1ID
join SubType2 s2 on s2.SubType2ID = p.SubType2ID
join GeographicMandates gm on gm.GeographicMandateID = p.GeographicMandateID

where p.prodclasscategoryid = 4
and fia.year = 2014
and fia.quarter = 6/3
and p.Rank = 1

order by m.ManagerName, p.ProductName

--get filtered dataset
select * from @tmp 
where 
Sector in ('Core')

第二个临时表:

--define temporary table
declare @tmp2 table (
      ManagerID int null,
      ManagerName varchar(250),
      ProductID int null,
      ProductName varchar(250),
      RFIFixedIncomeAttributionID int null,
      Value decimal(8,4) null,
      Name varchar(250),
      Sector varchar(250)
      )

--populate temp table
insert into @tmp2

select 
m.ManagerID, m.ManagerName, p.ID as 'ProductID', p.ProductName, sa.RFIFixedIncomeAttributionID, sa.Value, sc.Name,

case when gm.GeographicMandateID = 2 and s1.SubType1ID = 10 and s2.SubType2ID = 39 then 'Core'
    when gm.GeographicMandateID = 2 and s1.SubType1ID = 10 and s2.SubType2ID = 38 then 'Intermediate'
end as 'Sector'

from Products p

join Managers m on m.ManagerID = p.ManagerID
join Vehicles v on v.ProductID = p.ID
join ManagerAccounts ma on ma.VehicleID = v.ID
join Accounts a on a.MgrAccountID = ma.MgrAccountID
left join RFIFixedIncomeAttribution fia on fia.ParentID = a.AccountID and fia.ParentTypeID = 6
left join RFIFixedIncomeSectorAllocation sa on sa.RFIFixedIncomeAttributionID = fia.ID
    and sa.RFIFixedIncomeDataTypeID = 1
join RFIFixedIncomeSectorCategories sc on sc.ID = sa.RFIFixedIncomeSectorCategoryID
join SubType1 s1 on s1.SubType1ID = p.SubType1ID
join SubType2 s2 on s2.SubType2ID = p.SubType2ID
join GeographicMandates gm on gm.GeographicMandateID = p.GeographicMandateID

where p.prodclasscategoryid = 4
and fia.year = 2014
and fia.quarter = 6/3
and p.Rank = 1

order by m.ManagerName, p.ProductName

--get filtered dataset
select * from @tmp2 
where 
Sector in ('Core')

2 个答案:

答案 0 :(得分:1)

已经提出的几点

  • 联盟是你想要的词,加入是完全不同的。

  • 您正在使用临时表,而是使用表变量。

  • 并不完全相同
  • mysql和mssql不是一回事,将你的问题标记为一个或另一个,而不是两者。

    select * from @tmp
    union all
    select * from @tmp2 where productID not in (select productID from @tmp)
    

我不确定我是否依赖MySQL中的这个查询,因为它会与not in子句斗争...你可以在Jasmine的下半部分中使用连接语法工会条款。

答案 1 :(得分:0)

这是"在另一个表中找到所有没有MATCH的行"我们有一个模式。首先,交换你的表 - 你期望缺少行的表将是第二个或右表,另一个是LEFT表。

select <columns>
from table1
LEFT OUTER JOIN table1.ID = table2.ID
where table2.ID IS NULL

或者......不要交换表并使用RIGHT OUTER JOIN - 但那是非标准的。

在您的代码中,存在问题...

and fia.quarter = 6/3

相当于:

and fia.quarter = 2

我认为你需要一些引号。