SQL 编码约定:使用 UNION 的长 select 语句

SQL coding convention: Long select statements with UNION

这是一个非常基础的问题,但是我在网上没有找到任何东西。

假设我有一个很大的 SQL 文件,其中包含数百个长 select 语句,如下所示:

SELECT 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', NULL UNION
SELECT 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', NULL 

这里的UNION应该在最后,还是在前面,像这样:

SELECT 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', NULL 
UNION SELECT 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', NULL
SELECT 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', NULL UNION
SELECT 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', NULL

      SELECT 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', NULL
UNION SELECT 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', NULL

没关系。

列将根据第一个 select 命名。 UNION 将删除重复项,UNION ALL 不会。

这是一个非常个人风格的问题。有的写:

SELECT
id,
name,
dob
FROM PERSON;

一些 - 像我一样 - 写:

SELECT
  id
, name
, dob
FROM PERSON;

我这样做的一个理由(这是有争议的)是,您可以只用两个破折号注释除第一列之外的所有列,而不必 fiddle 用逗号左右。不过大概是因为喜欢吧。

出于同样的原因,我的朋友 mauro 写道:

select 42,'Arthur Dent',date '1957-04-22' union all
select 43,'Ford Prefect',date '1900-08-01' union all
select 44,'Tricia McMillan',date '1959-03-07'
;

..我写:

          SELECT 42,'Arthur Dent',DATE '1957-04-22'
UNION ALL SELECT 43,'Ford Prefect',DATE '1900-08-01'
UNION ALL SELECT 44,'Tricia McMillan',DATE '1959-03-07'
;

这里没有对错之分。我只是建议您保持一致 - 与您自己以及与您从事同一项目的所有人保持一致。

干杯 - 马可