我正在尝试获得Oracle中一系列横向连接的语法。
我有一个authors
表,其中包含作者的id
、name
和home
;我有一个books
表,其中id
,authorid
是books(id)
,title
和price
的外键。
我想使用横向连接来计算税(price*0.1
)和包含价格(price+tax
),以及包括作者的姓名和家庭。
下面是一个在PostgreSQL和MySQL中工作的版本:
SELECT
id,title,
price, tax, inc,
givenname, othernames, familyname,
home
FROM books
JOIN LATERAL(SELECT price*0.1) AS sq(tax) ON true
JOIN LATERAL(SELECT price+tax) AS sq2(inc) ON true
LEFT JOIN LATERAL(SELECT givenname,othernames,familyname FROM authors
WHERE authors.id=books.authorid) AS sw2 ON true;
在MSSQL中也是这样:
SELECT
id,title,
price, tax, inc,
givenname,othernames,familyname,
home
FROM books
CROSS APPLY(SELECT price*0.1) AS sq(tax)
CROSS APPLY(SELECT price+tax) AS sq2(inc)
OUTER APPLY(SELECT givenname,othernames,familyname,home FROM authors
WHERE authors.id=books.authorid) AS sw2;
我知道Oracle有CROSS APPLY
和OUTER APPLY
语法,以及更标准的LATERAL
语法。我还知道以下Oracle怪癖:
SELECT … FROM dual
- 不能将
AS
用于表别名
我已经尝试了我能想到的每一种语法组合,但我总是得到一些神秘的错误,如SQL command not properly ended
或MISSIING KEYWORD
或其他同样具有启发性的东西。
这类查询的正确语法是什么?
- 备注**
我知道还有其他方法可以得到同样的结果,这是一个微不足道的例子。这是一个关于如何在Oracle中编写横向连接的问题。
- 更新**
好吧,答案是:
Oracle不喜欢这样的语法:
(SELECT price*0.1) sq(tax)
它希望别名位于子查询中:
(SELECT price*0.1 AS tax)
1条答案
按热度按时间r3i60tvu1#
如果你真的想使用
LATERAL
join,那么:authors
不需要是LATERAL
连接,OUTER
连接就足够了。*但是,您不需要使用
LATERAL
join:其中,对于样本数据:
两个查询都输出:
| ID|标题|价格|税务|INC|名称|其他名称|家庭名称|关于我们|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 1|如何烹饪四个人|四十二|4.2|四十六点二|一个|大|怪兽|洞穴|
| 2|人体模型维护:对于假人|3.99|点399口径|4.389|联系我们|联系我们|联系我们|联系我们|
fiddle