Select

什麼是 F301:查詢表達式中的 CORRESPONDING 子句?

  • August 17, 2018

SQL 2011 Spec 支持一個CORRESPONDING子句,

特徵 F301,“CORRESPONDING在查詢表達式中”:

這個功能是什麼?它是如何使用的?而且,它是否受到任何行業 RDBM 的支持?

句法

從 SQL: 2011 規範(也在SQL-92中),它是這樣記錄的,

<corresponding spec> ::=
 CORRESPONDING [ BY <left paren> <corresponding column list> <right paren> ]

語法的其他相關部分被定義為,

<query expression body> ::=
 <query term>
 | <query expression body> UNION [ ALL | DISTINCT ]
 [ <corresponding spec> ] <query term>
 | <query expression body> EXCEPT [ ALL | DISTINCT ]
 [ <corresponding spec> ] <query term>

<query term> ::=
 <query primary>
 | <query term> INTERSECT [ ALL | DISTINCT ]
 [ <corresponding spec> ] <query primary>

<query primary> ::=
 <simple table>
 | <left paren> <query expression body>
 [ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> 
]
 <right paren>

<simple table> ::=
 <query specification>
 | <table value constructor>
 | <explicit table>

<explicit table> ::=
 TABLE <table or query name>

請注意,沒有BY ( corresponding column list )效果與 a 相同,應避免使用NATURAL JOIN這種形式。CORRESPONDING

例子

似乎是UNION, where 應該接受表格作為參數,並接受一個簡單EXCEPT的s列表,INTERSECT``COLUMN``JOIN``USING

CREATE TABLE foo ( col1 int, col2 text );
CREATE TABLE bar ( col2 text, col1 int );

TABLE foo
UNION ALL CORRESPONDING BY (col1,col2) TABLE bar;
  • TABLE是 的簡寫SELECT * FROM foo

實現

似乎很少有數據庫實現它。如果數據庫確實支持這一點並且我錯過了它,請隨時在下面發表評論。

簡而言之,CORRESPONDING將其引入 SQL 標準以使語法更符合關係模型 (RM) 的精神。

一個完整的答案將不可避免地涉及關於 SQL 語言如何特別偏離關係模型(例如空值)和一般良好的語言設計(例如數據類型)的討論。

本質上,在 1992 年之前,一些 SQL 語法,例如UNION依賴於從左到右的列排序。例如,如果不挑剔數據類型及其兼容性等,以下內容將不起作用:

SELECT col1, col2 FROM Table1 WHERE col3 = 0
UNION
SELECT col2, col1 FROM Table1 WHERE col3 = 1

因為這些列不遵循相同的從左到右的順序。

當然,在 RM 中,關係具有一組屬性,而隱含的集合沒有排序。但是,原始 SQLUNION語法暗示它SELECT col1, col2 FROM Table1SELECT col2, col1 FROM Table1.

因此,UNION CORRESPONDING糾正了早期的設計缺陷,即

SELECT col1, col2 FROM Table1 WHERE col3 = 0
UNION CORRESPONDING
SELECT col2, col1 FROM Table1 WHERE col3 = 1

會給出正確的結果。

引用自:https://dba.stackexchange.com/questions/212266