1

我想知道是什么决定了 SQL 查询中返回的列的顺序。

例如,SELECT * FROM SOMETABLE;

SQ_ID   |BUS_TYPE   |VOIP     |LOCAL_PHONE
--------|-----------|---------|-------------
SQ000001|Business   |Y        |N

我猜这个属性COLUMN_ID决定了这一点。例如,在表连接的情况下,SELECT * FROM SOMETABLE LEFT JOIN OTHERTABLE USING (SOME_COL);现在如何确定顺序。

4

2 回答 2

2

如USER_TAB_COLUMNS 所示,列的顺序SELECT * FROM some_table由每列的顺序决定。column_id

列的顺序SELECT * FROM some_table JOIN other_table是每个表的所有列,从 FROM 子句后最左边的表开始。换句话说,这...

SELECT * FROM some_table JOIN other_table

……相当于这个……

SELECT some_table.*, other_table.* FROM some_table JOIN other_table

将该内部联接更改为 LEFT JOIN 或 RIGHT JOIN 不会更改投影。


这当然是理论上的。我们永远不应该select *在生产代码中使用。加入时使用表别名的显式列声明总是更安全。除了更好地表达意图之外,显式投影还可以保护我们的代码免受未来对表的更改,例如添加 LOB 列或列名,这会与连接表的列产生歧义。

于 2013-02-19T09:35:52.823 回答
1

您可以在 Select 语句中列出列的顺序:

SELECT SOME_COL, SOME_OTHER_COL
FROM SOMETABLE LEFT JOIN OTHERTABLE USING (SOME_COL)

但是您也谈到了影响顺序的 ID 和一般的排序。所以我认为您也可能正在寻找 ORDER BY 来对行进行排序:

SELECT *
FROM SOMETABLE LEFT JOIN OTHERTABLE USING (SOME_COL)
ORDER BY SOME_COL

在这种情况下也很方便的是别名的使用。特别是当两个表都有同名的列时:

SELECT s.some_col, o.some_col
FROM SOMETABLE s LEFT JOIN OTHERTABLE o ON(o.id = s.id)
ORDER BY o.SOME_COL

在这种情况下,我使用 ON JOIN 语法,因为我发现在使用别名时这更直观,但它也应该与 USING 一起使用。

于 2013-02-19T09:03:45.377 回答