2014-09-29 3 views
0

Я хотел бы присоединиться к двум временным таблицам в одну большую таблицу темп. Я хочу, чтобы все записи из моей первой таблицы temp и я хочу, чтобы записи из моей второй таблицы temp ТОЛЬКО, если ProductID не существует в моей первой таблице temp.Объединение двух таблиц температуры

Сначала временная таблица:

--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

OK. Что вас останавливает? –

+2

Это табличные переменные, а не таблицы temp, таблицы таблиц начинаются с '#' или '##', это переменные таблицы, так как они называются '@ tablename' –

+1

Без разбора кода Wall O, есть ли что-либо у вас против 'union all'? Также, пожалуйста, выберите платформу. Mysql и Sql Server являются 2 отличными DMBS – paqogomez

ответ

1

Несколько моментов, которые уже воспитали

  • Союз является термин, который вы хотите, присоединиться нечто совсем иное.

  • Вы не работаете со временными таблицами, вы работаете со переменными таблицы. Не совсем то же самое

  • mysql и mssql - это не одно и то же, пометьте ваши вопросы так же, как и то, и другое.

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

Не уверен, что если бы я полагаться на этот запрос в MySQL, как это будет бороться с не в п ... вы можете использовать синтаксис присоединиться в ответ Жасмин во второй половине союз.

+0

Я действительно не рассматривал код, я предполагаю, что он испорчен. Я только посмотрел на результаты, которые он хочет. Это известная проблема. Образец, который я разместил, является ОДНОМ известным решением для него, но не единственным. Это стандарт ANSI, поэтому он должен работать в любой СУБД ANSI-sql. Мой ответ - это случай того, что я отчаянно пытаюсь сделать здесь - научить кодированию, а не кодировать его для них. – Jasmine

+0

Я согласен ... просто думал, что его проблема связана с непониманием объединения и союза. – Twelfth

+0

Трудно сказать. Обычно я объясняю, что JOIN ставит таблицы бок о бок, а UNION ставит их в последовательном порядке. – Jasmine

0

Это случай «найти все строки с NO MATCH в другой таблице» и у нас есть шаблон для этого , Во-первых, поменяйте местами таблицы - таблица, в которой вы ожидаете отсутствие строк, будет второй или правой таблицей, другая - таблицей LEFT.

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

ИЛИ ... не меняйте местами таблицы и используйте ПРАВИЛЬНУЮ ВНУТРЕННУЮ РАБОТУ - но это нестандартно.

В коде есть проблема ...

and fia.quarter = 6/3 

эквивалентно:

and fia.quarter = 2 

Я думаю, что вам нужны кавычки там.