2013-05-13 2 views
0

У меня есть следующая инструкция sql. Я потянув данные из плоской структуры дерева, где я хочу, чтобы выбрать один толкатель соответствующего abos_daten.erstellt = (select MAX(erstellt)...Вложенность выбирает и ссылается на внешнюю таблицу

Проблема заключается в том, чтобы выбрать правильный MAX(erstellt) мне нужно следующее условие where t2.parent_id = t1.parent_id. К сожалению, t1 не может быть привязан, поскольку он ссылается на внешний оператор select. Кажется, создается круг.

select * from trees as t1 inner join abos_daten as starter on t1.parent_id = starter.abonr 
right outer join 
    (select * from trees as t3 inner join abos_daten on t3.child_id = abos_daten.abonr 
    where abos_daten.erstellt = (select MAX(erstellt) from abos_daten inner join trees as t2 on t2.child_id = abos_daten.abonr 
           where t2.parent_id = t1.parent_id and abos_daten.status_id <> 147 
           ) 
    ) as follower on t1.child_id = follower.abonr 

Кто-нибудь знает, как это решить? С уважением, jonatan

+0

Имена таблиц, как 'abos_daten' не значат для английского языка. Возможно, вы могли бы изменить свой вопрос, указав имена таблиц и столбцов, которые помогут прояснить ваш пример. – Andomar

ответ

2

Для начала, t1 на самом деле не ссылается на внешний оператор select; он ссылается на другой объект в предложении from. Как это бывает, SQL-сервер имеет синтаксис, который специально позволяет такую ​​функциональность: применять cross apply/outer. Для того, чтобы использовать это в вас ситуации, вы хотите что-то вроде этого (непроверенные, так как я не могу повторно создавать таблицы):

select * 
from trees as t1 
    inner join abos_daten as starter 
     on t1.parent_id = starter.abonr 
    outer apply (select MAX(erstellt) as max_erstellt 
        from abos_daten 
         inner join trees as t2 
         on t2.child_id = abos_daten.abonr 
        where t2.parent_id = t1.parent_id 
         and abos_daten.status_id <> 14) as t_m 
    right outer join (select * 
         from trees as t3 
          inner join abos_daten 
           on t3.child_id = abos_daten.abonr) as follower 
     on t1.child_id = follower.abonr 
      and t_m.max_erstellt = follower.erstellt 
+0

до сих пор правильное решение. Я тестирую свои данные. СПАСИБО! – encc

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