Oracle:多个横向联接或应用的语法

bkkx9g8r  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(161)

我正在尝试获得Oracle中一系列横向连接的语法。
我有一个authors表,其中包含作者的idnamehome;我有一个books表,其中idauthoridbooks(id)titleprice的外键。
我想使用横向连接来计算税(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 APPLYOUTER APPLY语法,以及更标准的LATERAL语法。我还知道以下Oracle怪癖:

  • SELECT … FROM dual
  • 不能将AS用于表别名

我已经尝试了我能想到的每一种语法组合,但我总是得到一些神秘的错误,如SQL command not properly endedMISSIING KEYWORD或其他同样具有启发性的东西。
这类查询的正确语法是什么?

    • 备注**

我知道还有其他方法可以得到同样的结果,这是一个微不足道的例子。这是一个关于如何在Oracle中编写横向连接的问题。

    • 更新**

好吧,答案是:
Oracle不喜欢这样的语法:

(SELECT price*0.1) sq(tax)

它希望别名位于子查询中:

(SELECT price*0.1 AS tax)
r3i60tvu

r3i60tvu1#

如果你真的想使用LATERAL join,那么:

SELECT b.id,
       b.title,
       b.price,
       t.tax,
       i.inc,
       a.givenname,
       a.othernames,
       a.familyname,
       a.home
FROM   books b
       CROSS JOIN LATERAL(SELECT price*0.1 AS tax FROM DUAL) t
       CROSS JOIN LATERAL(SELECT price+tax AS inc FROM DUAL) i
       LEFT OUTER JOIN authors a
       ON a.id=b.authorid;
  • 注意:authors不需要是LATERAL连接,OUTER连接就足够了。*

但是,您不需要使用LATERAL join:

SELECT b.id,
       b.title,
       b.price,
       b.price * 0.1 AS tax,
       b.price * 1.1 AS inc,
       a.givenname,
       a.othernames,
       a.familyname,
       a.home
FROM   books b
       LEFT OUTER JOIN authors a
       ON a.id=b.authorid;

其中,对于样本数据:

CREATE TABLE books ( id, title, price, authorid ) AS
  SELECT 1, 'How to cook 4 humans', 42, 1 FROM DUAL UNION ALL
  SELECT 2, 'Mannequin Maintenance: For Dummies', 3.99, 2 FROM DUAL;

CREATE TABLE authors ( id, givenname, othernames, familyname, home ) AS
SELECT 1, 'A', 'Large', 'Monster', 'Cave' FROM DUAL;

两个查询都输出:
| ID|标题|价格|税务|INC|名称|其他名称|家庭名称|关于我们|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 1|如何烹饪四个人|四十二|4.2|四十六点二|一个|大|怪兽|洞穴|
| 2|人体模型维护:对于假人|3.99|点399口径|4.389|联系我们|联系我们|联系我们|联系我们|
fiddle

相关问题