2012-06-22 3 views
0

Как сделать этот подзаголовок красивым кодом? И я ищу руководства по оптимизации SQL и стилю кода.SQL-подзапросы, кодирующие стиль

SELECT foo FROM table WHERE foo_id IN 
    (
    SELECT idchild FROM table2 WHERE idparent IN 
    (SELECT idchild FROM table2 WHERE idparent IN 
    (SELECT idchild FROM table2 WHERE idparent = @id) 
    )) 
AND txt_type ='some_cat' 
+1

Трехуровневое вложение внутри запроса заставляет меня думать, что вы разрабатываете какой-то иерархический запрос. В этом случае [CTE] (http://msdn.microsoft.com/en-us/library/ms186243 (v = sql.105) .aspx) может оказать вам некоторую помощь. – dasblinkenlight

ответ

2

Для повышения производительности и читаемости, сделать это:

select t4.foo 
from table2 t1 
join table2 t2 on t2.idparent = t1.idchild 
join table2 t3 on t3.idparent = t2.idchild 
join table t4 on t4.foo_id = t3.idchild and t4.txt_type ='some_cat' 
where t1.idparent = @id 

Обратите внимание, как первая таблица, выбранный из имеет индексный предикат в ИНЕКЕ. Этот запрос будет использовать индексированный доступ полностью через запрос и быть очень эффективным.

Также обратите внимание, как я переместил предикат для txt_type в пункт on, где он может быть применен во время чтения строки, а не после сборки соединений.

+0

Отредактировано: я изменил запрос немного, чтобы улучшить производительность - см. Последний параграф ответа – Bohemian

1

Либо использовать Решение Praxen или следующее. Оба они правильно оптимизированы.

SELECT foo 
FROM table1 
WHERE EXISTS (SELECT 1 
       FROM table2 
       WHERE idparent = @id 
         AND table2.idchild = table1.foo_id) 
     AND txt_type = 'some_cat'