2014-10-31 2 views
3

Резюме: мне нужно профсоюзная запись один и те же таблицы из баз данных, названных лет как prefix_2012, prefix_2013, prefix_2014 - без двуличности на основе уникального id ключа. Третья сторона определяется по базе данных, и я не могу ее изменить.Как данные UNION без дубликатов относительно ключа?

Можно ли определить его как вид?

Подробнее: Позвольте более подробному объяснению того, что я хочу, описано в следующем примере. Он возвращает все записи со всеми двуличностями.

SELECT 
    id, 
    a, 
    b 
FROM prefix_2014.mytable 
UNION ALL 
SELECT 
    id, 
    a, 
    b 
FROM prefix_2013.mytable 
UNION ALL 
    id, 
    a, 
    b 
FROM prefix_2012.mytable 

При замене UNION ALL на UNION только идентичные записи объединяются. (То есть только тогда, когда значения во всех столбцах одинаковы. Я прав?)

Когда новый год создаются баз данных, все открытых записей передаются с прошлым годом, а в прошлом году база данных содержание заморожено. Перенесенные записи первоначально дублируются в техническом смысле (одинаковые значения во всех столбцах). Однако содержимое переданных записей с тем же id может быть изменено позже.

Вопрос: на основе уникальной id, как я могу союз записи из всех баз данных на основе года, так что, если запись происходит от более позднего года, в предыдущие годы записи игнорируются в двуличности? Можно ли это сделать без явного цикла и без временных таблиц? Можно ли написать это мнение?

+0

Является ли идентификатор непрерывным между таблицами? Вы просто хотите уникальных a, b через эти таблицы? – Hozikimaru

+0

Только идентификатор уникален. А и могут быть изменены. Мне нужно только самое новое a, b. Не все идентификаторы копируются на новый год. – pepr

+0

Какой сервер баз данных вы используете? Oracle? DB2? –

ответ

2

Я не эти таблицы и данные, так что это, возможно, потребуется некоторая работа Сначала нужно создать представление идентификаторов и лет, как так:

CREATE VIEW YearIDs AS 
SELECT ID, Max(year) FROM 
(SELECT 
    id, 2014 as year 
FROM prefix_2014.mytable 
UNION 
SELECT 
    id, 2013 
FROM prefix_2013.mytable 
UNION 
    id, 2012 
FROM prefix_2012.mytable) 
GROUP By ID) 

сейчас внутреннее соединение для каждого выбора в вашем соединении:

SELECT T1.id, T1.a, T1.b 
FROM prefix_2014.mytable AS T1 
INNER JOIN YearIDs AS Y1 ON Y1.Id = T1.ID AND Y1.year = 2014 
UNION ALL 
SELECT T2.id, T2.a, T2.b 
FROM prefix_2013.mytable AS T2 
INNER JOIN YearIDs AS Y2 ON Y2.Id = T2.ID AND Y2.year = 2013 
UNION ALL 
SELECT T3.id, T3.a, T3.b 
FROM prefix_2012.mytable Y3.Id = T3.ID AND AS T3 
INNER JOIN YearIDs AS Y3 ON Y3.year = 2012 
+0

«GROUP BY ID», вероятно, не следует за ')'. Для Microsoft SQL 2014 перед 'GROUP' должно быть' AS t'. В противном случае сообщается о синтаксической ошибке. – pepr

+0

Спасибо за вашу помощь;) Я, наконец, закончил с двумя видами. Первый, который извлекает идентификаторы и максимальный год, а второй - с нижним. – pepr

+0

@pepr Вы правы, я уверен, но у меня нет sql 2014 и не выполнял запрос, поскольку у меня нет этих таблиц. Просто работаю из памяти. – Kell

2

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

WITH CTE AS(SELECT 
    id, 
    3 as [Year] 
FROM prefix_2014.mytable 
UNION ALL 
SELECT 
    id, 
    2 as [Year] 
FROM prefix_2013.mytable 
UNION ALL 
Select 
    id, 
    1 as [Year] 
FROM prefix_2012.mytable) 
Select ID,MAX([Year]) as YR into #T From CTE 
group by ID 


Select t.ID,a,b From #T t 
join Test1 t1 
on t1.id = t.id 
where YR = 1 
UNION ALL 
Select t.ID,a,b From #T t 
join Test2 t2 
on t2.id = t.id 
where YR = 2 
UNION ALL 
Select t.ID,a,b From #T t 
join Test3 t3 
on t3.id = t.id 
where YR = 3 

Это обновленная версия. Это в основном различные версии запроса Келла

+0

Хмм, не уверен, что это будет работать, поскольку предложение group by включает все три поля, поэтому вы получите все не повторяющиеся данные. – Kell

+0

Если он хочет иметь идентификатор, он может включить идентификатор, в его вопросе, я думаю, он имеет в виду все данные.Если идентификатор не требуется, идентификатор можно просто удалить из группы select и group by. – Hozikimaru

+0

'id' уникален, но' a' и 'b' могут быть помечены. Мне нужна только самая новая версия 'a' и' b'. 'GROUP BY' также потребует некоторой операции группировки (например,' SUM' ...). Я прав? – pepr

Смежные вопросы