2015-12-09 9 views
3

Может кто-то пожалуйста объяснить внутреннее соединение синтаксис ниже SQL:Postgres SQL внутреннее соединение синтаксиса

CREATE TABLE dataset AS 
    SELECT property.id 
     , amount.band 
     , amount."value" 
FROM property 
INNER JOIN (locality INNER JOIN amount ON locality.code = amount.code) ON (property.band = amount.band) AND (property.id = locality."UniqueId") 

Почему таблица locality определяется до второго внутреннего соединения? Я никогда не сталкивался с таким странным синтаксисом.

Есть ли более четкий способ решения одного и того же запроса, чтобы кто-то мог легко понять, что происходит?

+1

Этот синтаксис не относится к Postgres. Это разрешено стандартом SQL, и я видел это также с SQL Server, хотя я никогда не понимал, как это сделать. –

+0

Этот синтаксис был удален из стандарта ANSI SQL в SQL-2003 или SQL-2008. BTW, значение - зарезервированное слово, его нужно разграничить как «значение». – jarlh

+0

'... INNER JOIN (SELECT * FROM locality INNER JOIN ...' – jarlh

ответ

2
FROM property 
    INNER JOIN (locality INNER JOIN amount ON locality.code = amount.code) 
    ON (property.band = amount.band) AND (property.id = amount."UniqueId") 

такая же, как

FROM property 
    INNER JOIN amount ON property.band = amount.band AND property.id = amount."UniqueId" 
    INNER JOIN locality ON locality.code = amount.code 

Когда INNER JOIN S только, вы можете изменить порядок их, как вы хотите.

(Любая конкретная причина РЕГИСТРИРУЙТЕСЬ локальность? Вы не выбрали какие-либо из ее столбцов. Является ли это какое-то EXISTS, или вы хотите, чтобы несколько строк возвращаются, если существует несколько соответствующих строк в этой таблице?)

+0

Я обновил исходный sql - должен был быть '(property.id = locality." UniqueId ")'. Означает ли это, что мне нужно переместить 'AND' в местное соединение? – adam78

+0

@ozzii, да, переместите это условие. (Вам не разрешено иметь условия ON для таблиц, еще не указанных в цепочке соединений. Прочитайте слева направо.) – jarlh

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