2015-04-21 3 views
0

Это мой первый пост на этом форуме, поэтому, пожалуйста, поймите.SQL - Присоединитесь к двум таблицам без уникальных полей

У меня есть следующая проблема.

Я хочу двух соединить две таблицы:

Table1:

Product | Start Date | End Date 
------------------------------------- 
Product1 | 01/01/2014 | 01/05/2015 
Product2 | 01/03/2014 | 01/01/2015 

Table2:

Product | Start Date | End Date | Value 
-------------------------------------------- 
Product1 | 01/01/2014 | 01/02/2015 | 10 
Product1 | 02/02/2014 | 01/04/2015 | 15 
Product1 | 02/04/2014 | 01/05/2015 | 15 
Product2 | 01/03/2014 | 04/05/2014 | 5 
Product2 | 05/05/2014 | 01/01/2015 | 5 

Чтобы иметь таблицу с последним значением, как:

Product | Start Date | End Date | Value 
------------------------------------------------ 
Product1 | 02/04/2014 | 01/05/2015 | 15 
Product2 | 05/05/2014 | 01/01/2015 | 5 

Мне нужно присоединиться к em, а не использовать только вторую таблицу, потому что у обоих из них есть более уникальные столбцы, которые мне нужно использовать.

Я думал о том, чтобы сначала использовать некоторую функцию IF на второй таблице, чтобы сделать одну строку для каждого продукта (тот, у кого была дата начала), и просто присоединиться к ней просто с первой таблицей. Но я не знаю, как сделать первую часть.

Я действительно с нетерпением жду вашей помощи.

С уважением, Matt

+0

Итак, это звучит как продукт + Start + End являются уникальными в Таблица 1, но rep Таблица 2. Это правильно? Вы хотите суммировать значение из таблицы 2? –

+1

Как вы решаете, какую строку использовать из 'Table2'? –

+0

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

ответ

0

Просто используйте WHERE NOT EXISTS, чтобы отфильтровать все, кроме последней даты из TABLE2 (я предполагаю, что вы запрашиваете последний STARTDATE из TABLE2; также добавляю «SomeOtherField» в таблицу1, потому что в противном случае вы могли бы просто запросить таблицу2):

SELECT t1.Product, t1.SomeOtherField, t2.StartDate, t2.EndDate, t2.Значение

ОТ Table1 t1

JOIN (SELECT a.Product, a.StartDate, a.EndDate, a.value ОТ Table2

ГДЕ НЕ СУЩЕСТВУЕТ (SELECT * FROM Table2 б

ГДЕ b.Product = a.Product И b.StartDate> a.StartDate)) t2

ON (t2.Product = t1.Product)

0

Это возможно, запрос будет включать в себя три этапа:

  1. Найти все макс start date для каждого product в таблице 2. Подсказка: используйте группу по.
  2. Соедините таблицу 2 с результатом №1, чтобы получить Value.
  3. Регистрация таблицы 1 с результатом от # 2, чтобы отфильтровать продукты, которые не в таблице 1.
0

Не уверен, что вам нужно Table1 на все в вашем примере, вам просто нужно агрегировать Table2 найти MAX([Start Date] для каждого Product:

SELECT a.* 
FROM Table2 a 
JOIN (SELECT Product,MAX([Start Date]) AS Mx_Start_Dt 
     FROM Table2 
     GROUP BY Product 
    ) b 
    ON a.Product = b.Product 
    AND a.[Start Date] = b.Mx_Start_Dt 

Если вам нужно принести в полях от Table вы можете просто добавить еще один JOIN:

SELECT a.*,b.* 
FROM Table1 a 
JOIN (SELECT a.* 
     FROM Table2 a 
     JOIN (SELECT Product,MAX([Start Date]) AS Mx_Start_Dt 
      FROM Table2 
      GROUP BY Product 
      ) b 
     ON a.Product = b.Product 
      AND a.[Start Date] = b.Mx_Start_Dt 
    ) c 
    ON a.Product = b.Product 

При использовании базы данных, которая поддерживает аналитические функции, вы можете сделать его чище через ROW_NUMBER() функции:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Product ORDER BY [Start Date] DESC) AS RN 
       FROM Table2 
      ) 
SELECT * 
FROM Table1 a 
JOIN cte b 
    ON a.Product = b.Product 
    AND b.RN = 1 
0

Вот решение, использующее ROW_NUMBER в SQLServer:

SELECT * 
FROM (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Product ORDER BY StartDate DESC) RN 
    FROM @T 
) Results 
WHERE RN = 1 
Смежные вопросы