2013-08-08 5 views
0

Я пытаюсь создать представление, которое выбирает из активной и архивной таблицы, но только возвращает запись из папки архива, когда запись не существует в активной папке. Он также должен возвращать только архивную запись с последней меткой времени.Отображение отсортированного набора данных из двух таблиц

Спасибо

Пример:

Активность:

*ID ItemID Price* 
1 001  1.00 

2 002  4.99 

3 004  2.00 

Архив

*ID ItemID Price ArchiveDate* 

1 001 0.99 1/1/2013 

2 002 3.78 1/1/2013 

3 003 5.00 1/5/2013 

4 005 3.49 1/5/2013 

5 003 6.99 1/10/2013 

должен возвратить следующий набор данных

*ItemID Price* 

001  1.00 

002  4.99 

003  6.99 <-- From Archive 

004  2.00 

005  3.49 <-- From Archive 
+0

Большое спасибо за помощь. – drummer0512

+0

Должен был изменить мой принятый ответ, так как заказ на ответ Майкла не был принят в моем представлении. В любом случае я ценю помощь. Спасибо вам всем. – drummer0512

ответ

2

Так что вам нужно, чтобы получить Everthing из ACTIVE [Первая часть UNION ниже [, затем добавить записи из архива [Вторая часть Союз[. В архивных записях выделите те, которые не существуют в таблице ACTIVE [Предложение NOT EXISTS], и получите только запись с последней датой [MAX (ArchiveDate)].

SELECT ItemID 
     ,Price 
FROM ACTIVE 
UNION 
SELECT ItemID 
     ,Price 
FROM ARCHIVE AA 
WHERE AA.ArchiveDate = (SELECT MAX(ArchiveDate) FROM ARCHIVE AA1 WHERE AA1.ItemID = AA.ItemID) 
AND  NOT EXISTS (SELECT 1 FROM ACTIVE A WHERE A.ItemID = AA.ItemID) 
3

Вы можете использовать следующее:

SELECT ItemID, Price 
FROM 
(
-- All of the active records 
SELECT ItemID, Price 
FROM Active 
UNION ALL  
-- combined with the latest archive records for missing actives 
SELECT ItemID, Price 
FROM Archive AS A1 
WHERE ArchiveDate=(SELECT MAX(ArchiveDate) 
        FROM Archive AS A2 
        WHERE A2.ItemID=A1.ItemID) 
     AND NOT EXISTS(SELECT 1 
        FROM Active AS AC 
        WHERE AC.ItemID=A1.ItemID) 
) AS FinalResult 
-- Ordered by ItemID 
ORDER BY ItemID 
+1

Почему внешний выбор? Кроме того, не рекомендуется «SELECT *» в предложении EXISTS или NOT EXISTS - это плохая практика. –

+0

Внешний выбор предназначен для упорядочения результатов «UNION ALL». Изменил «EXISTS» на использование «SELECT 1», но я не уверен, почему это «плохая» практика, так как SQL Server не очень-то заботится о списке столбцов в выражении «EXISTS». –

+2

Если вы не увековечиваете [ВЫБОР * миф] (http://stackoverflow.com/questions/6137433/where-does-the-practice-exists-select-1-from -come-from). –

0
;with cte_archive as (
    select 
     ItemID, Price, 
     row_number() over (partition by ItemID order by ArchiveDate desc) as row_num 
    from Archive 
) 
select AC.ItemID, AC.Price 
from Active as AC 

union all 

select AH.ItemID, AH.Price 
from cte_archive as AH 
where AH.ItemID not in (select ItemID from Active) and AH.row_num = 1 
0
SELECT ItemID, Price 
FROM Active 
UNION ALL 
SELECT ItemID, Price 
FROM (
    SELECT ItemID, Price 
    FROM (
     SELECT ItemID, Price, 
       ROW_NUMBER() OVER(PARITION BY ItemID ORDER BY ArchiveDate DESC) rn 
     FROM Archive 
     WHERE NOT EXISTS(SELECT 1 FROM Active a WHERE a.ItemID = Active.ItemID) 
    ) sub 
    WHERE rn=1 
) Archive 
Смежные вопросы