2011-01-26 2 views
0

У меня есть SQL, как это:SQL соединения таблиц: эффективный синтаксис

select q1.*,q2* from (select * from t1,t2,t3 where t1.col1=t2.col1 and t2.col2=t3.col2) q1, (select * from p1,p2,p3 where p1.col1=p2.col1 and p2.col2=p3.col2) q2 where q1.col1 = q2.col1; 

Предполагая col1, col2, col3 являются уникальными (т.е. нет конфликтов имен) и wildcards заменяются собственными именами Col ... есть это правильный способ написать этот запрос?
Очень сложно читать.
Как это можно сделать более эффективным?
Также, когда мы делаем outer join, являются синтаксисы 'left join' и t1.col1 = t2col1(+) эквивалентом во всех смыслах?

Пожалуйста, дайте мне знать, если требуется дополнительная информация.

ответ

1

Во-первых, я бы отказался от привычки создавать перекрестные соединения через список таблиц с разделителями-запятыми (например, t1, t2, t3). Вместо этого вы должны принять синтаксис ANSI Join. Во-вторых, вы можете объединить обе производные таблицы в один запрос. В-третьих, я предлагаю явно объявить нужные столбцы, а не использовать Select * (в приведенном ниже примере я просто использовал многоточие, чтобы указать, что вам нужно заполнить нужные имена столбцов). Наконец, я бы не использовал какой-либо синтаксис + для обозначения левых объединений. Вместо этого используйте синтаксис Left Join

Select ... 
From T1 
    Join T2 
     On T2.Col1 = T1.Col1 
    Join T3 
     On T3.Col2 = T2.Col2 
    Join P1 
     On P1.Col1 = T1.Col1 
    Join P2 
     On P2.Col1 = P1.Col1 
    Join P3 
     On P3.Col2 = P2.Col2 
    Left Join X1 
     On X1.Col1 = T1.Col1 
1

«Правильный» находится в глазах смотрящего в некоторой степени. Я могу попытаться создать представления из подзапросов и присоединиться к представлениям.

Кроме того, когда мы делаем внешнее соединение, являются Синтаксисы «левое соединение» и t1.col1 = t2col1 (+) эквивалентно во всех смыслах?

Я уверен, что это было намерение. Я знаю, что этого не произошло в ранних версиях Oracle, поддерживающих синтаксис ANSI join. Однако я не помню подробностей.

Вы должны использовать синтаксис ANSI всюду, но магазин Oracle, и вы должны использовать его во многих магазинах Oracle.

Я думаю, что были различия в порядке оценки, которые могут привести к разным результатам. Это в основном потому, что Oracle внедрил свой собственный внешний синтаксис соединения до того, как ANSI определит, как должны работать внешние соединения.

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