Объединение таблиц по имени поля? (то есть порядок столбцов не может быть гарантирован) - PullRequest
3 голосов
/ 05 марта 2011

Я хотел бы составлять таблицы через UNION, но делать это по имени поля, поскольку таблицы имеют в основном одинаковые поля, но каждая таблица может иметь не все поля, а порядок столбцов может отличаться. Э.Г.

Table 1     Table 2     Table 3     Table 4
Age         Age          Age        Height
Height      Height       Height     Weight
Weight      Weight       Weight     Age
Race        Race         Gender     Gender
---         Gender 

Например, следующий код может сломаться в следующем примере:

      SELECT * FROM TABLE 1 
UNION ALL SELECT * FROM TABLE 2
UNION ALL SELECT * FROM TABLE 3
UNION ALL SELECT * FROM TABLE 4

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

Такие языки, как SAS, будут обрабатывать эти грациозно совпадающие столбцы по имени. Есть ли способ сделать это кратко в SQL, например, "UNION ALL BY NAME" или что-то в этом роде?

Ответы [ 2 ]

4 голосов
/ 05 марта 2011

Одна часть стандартной грамматики BNF SQL включает в себя:

<non-join query expression>    ::=
   <non-join query term>
 | <query expression body> UNION  [ALL|DISTINCT] [ <corresponding spec> ] <query term>
 | <query expression body> EXCEPT [ALL|DISTINCT] [ <corresponding spec> ] <query term> 
<corresponding spec>           ::= CORRESPONDING
                         [ BY <left paren> <corresponding column list> <right paren> ]
<corresponding column list>    ::=   <column name list> 
<column name list>    ::=   <column name> [ { <comma> <column name> }... ] 

Таким образом, теоретически вы можете использовать предложение CORRESPONDING для достижения именно того эффекта, который вам необходим.Однако не все СУБД поддерживают нотацию - вам нужно будет прочитать руководство, чтобы узнать.

Если нотация CORRESPONDING недоступна, вам придется перечислять имена столбцов в правильной последовательности в каждом отдельном разделе.часть запроса UNION.

4 голосов
/ 05 марта 2011

Я считаю, что все, что требуется для объединения всех таблиц, - это то, что они имеют одинаковое количество столбцов с одинаковыми типами данных

Так что я думаю, вы могли бы сделать

SELECT age, height, weight, gender, race FROM TABLE 1 
UNION ALL SELECT age, height, weight, gender, race FROM TABLE 2
UNION ALL SELECT age, height, weight, gender, race FROM TABLE 3
UNION ALL SELECT age, height, weight, gender, race FROM TABLE 4

И если, например, в таблице 3 не было гоночного поля, вы можете заменить его.

SELECT age, height, weight, gender, null AS race FROM TABLE 3 

Или другое значение по умолчанию вместо нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...