Select
什麼是 F301:查詢表達式中的 CORRESPONDING 子句?
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 中,關係具有一組屬性,而隱含的集合沒有排序。但是,原始 SQL
UNION
語法暗示它SELECT col1, col2 FROM Table1
與SELECT col2, col1 FROM Table1
.因此,
UNION CORRESPONDING
糾正了早期的設計缺陷,即SELECT col1, col2 FROM Table1 WHERE col3 = 0 UNION CORRESPONDING SELECT col2, col1 FROM Table1 WHERE col3 = 1
會給出正確的結果。