2016-02-12 3 views
-2

Таблицы и просил выход enter image description hereSQL, автообъединение на 3 присоединился к таблицам

Я использую настройки базы данных по умолчанию National Instrumets TestStand. Я попытался упростить расположение БД на картинке выше.

Я могу получить то, что хочу, через довольно сложный sql, и это очень медленно.

Я думаю, что есть лучший способ, а затем я наткнулся на САМОЕ ПРИСОЕДИНЕНИЕ. В основном я хочу получить данные из нескольких разных строк, начиная с одного «серийного номера».

Моя проблема состоит в том, чтобы объединить самосоединиться с «общим» соединением моих таблиц.

Я использую базу данных Access на данный момент.

+1

Пожалуйста, приложите свои структуры таблиц и выходные данные (вместе с данными образца) как часть вопроса, а не как ссылку на изображение. Вопрос/ответы будут бесполезны для других людей в будущем, если они содержат мертвые ссылки на соответствующую информацию. http://stackoverflow.com/help/how-to-ask –

+0

Также укажите, что вы пробовали до сих пор. –

+0

Можете ли вы показать нам, что у вас есть? – GabrielVa

ответ

0

Это даст вам выход вы прицеливание для с данными выборки:

with x as (
select 
row_number() over (partition by t1.Serial order by t1.Serial) as [RN], 
t1.Serial, 
case when t3.Sub_Test_Name = 'AAA' then t3.Value end as [AAA], 
case when t3.Sub_Test_Name = 'BBB' then t3.Value end as [BBB], 
case when t3.Sub_Test_Name = 'CCC' then t3.Value end as [CCC], 
case when t3.Sub_Test_Name = 'DDD' then t3.Value end as [DDD] 

from Table_1 t1 
inner join Table_2 t2 on t2.Table_1_Id = t1.Id 
inner join Table_3 t3 on t3.Table_2_Id = t2.Id 
) 

select 
x.Serial, 
AAA.AAA, 
BBB.BBB, 
CCC.CCC, 
DDD.DDD 

from x 
left outer join x AAA on AAA.Serial = x.Serial and AAA.RN = x.rn + 0 
left outer join x BBB on BBB.Serial = x.Serial and BBB.RN = x.rn + 1 
left outer join x CCC on CCC.Serial = x.Serial and CCC.RN = x.rn + 2 
left outer join x DDD on DDD.Serial = x.Serial and DDD.RN = x.rn + 3 

where x.rn = 1 

Это использует сам присоединяется, как вы упомянули (где вы видите x Оставшись присоединился к себе несколько раз в финале выберите заявление).

Я намеренно добавил дополнительные столбцы CCC и DDD, поэтому проще понять, как вы могли бы построить это для большего набора данных, увеличивая смещение row_number для каждого соединения.

Я тестировал это в SQL Fiddle, и вы можете поиграть с ним. Если вам необходимо применить дополнительные фильтры, ваше предложение where должно быть размещено внутри CTE.

Обратите внимание, что вы эффективно поворачиваете данные с помощью такого запроса (за исключением того, что мы не агрегируем что-либо, поэтому мы не можем использовать встроенную опцию PIVOT). Недостатком этого метода и реальных опор является то, что вам нужно вручную указать каждый заголовок столбца со своим собственным оператором в CTE и левым объединением в окончательном выборе. Это может стать громоздким в средних наборах данных, поэтому оно лучше всего подходит в случаях, когда у вас будет небольшое количество известных заголовков столбцов в ваших результатах.

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