简体   繁体   English

MySQL-重用嵌套的select语句

[英]MySQL - reuse nested select statement

I'm wondering whether there's a more efficient way of writing the following query (note the reuse of the same select statement resulting in A). 我想知道是否存在一种更有效的方式来编写以下查询(请注意重复使用导致A的同一select语句)。 I wouldn't worry too much about it, but I need to add one or two more 'parent' levels to this, and it just seems like there must be a better way than my naive approach. 我不会对此太担心,但是我需要为此添加一个或两个以上的“父”级别,这似乎比我的幼稚方法要好。

SELECT A.*, I.INVOICE_STATUS
FROM ( SELECT E.*, IL.INVOICE_LINE_ID, IL.INVOICE_LINE_INVOICE_ID
       FROM EXPENSE E
       LEFT JOIN INVOICE_LINE IL
       ON E.EXPENSE_ID = IL.INVOICE_LINE_EXPENSE_ID
       UNION
       SELECT E.*, IL.INVOICE_LINE_ID, IL.INVOICE_LINE_INVOICE_ID
       FROM EXPENSE E
       RIGHT JOIN INVOICE_LINE IL
       ON E.EXPENSE_ID = IL.INVOICE_LINE_EXPENSE_ID) A
LEFT JOIN INVOICE I
ON A.INVOICE_LINE_INVOICE_ID = I.INVOICE_ID
UNION
SELECT A.*, I.INVOICE_STATUS, I.INVOICE_DUE_DATE
FROM ( SELECT E.*, IL.INVOICE_LINE_ID, IL.INVOICE_LINE_INVOICE_ID
       FROM EXPENSE E
       LEFT JOIN INVOICE_LINE IL
       ON E.EXPENSE_ID = IL.INVOICE_LINE_EXPENSE_ID
       UNION
       SELECT E.*, IL.INVOICE_LINE_ID, IL.INVOICE_LINE_INVOICE_ID
       FROM EXPENSE E
       RIGHT JOIN INVOICE_LINE IL
       ON E.EXPENSE_ID = IL.INVOICE_LINE_EXPENSE_ID) A
RIGHT JOIN INVOICE I
ON A.INVOICE_LINE_INVOICE_ID = I.INVOICE_ID;

Thanks! 谢谢!

In Oracle, you could create what is called a common table expression with the WITH keyword. 在Oracle中,可以使用WITH关键字创建所谓的公用表表达式。 It works as follows: 其工作方式如下:

WITH ORACLE_CTE AS (SELECT * FROM DUAL CONNECT BY LEVEL <= 10);

In MySQL, you don't have such luxuries as you do in Oracle. 在MySQL中,您没有像在Oracle中那样奢侈。 So, you would do as follows: 因此,您将执行以下操作:

Create a procedure to create a temporary table that stores the result set of the following: 创建一个过程来创建一个临时表,该表存储以下结果集:

SELECT E.*, IL.INVOICE_LINE_ID, IL.INVOICE_LINE_INVOICE_ID
FROM EXPENSE E
LEFT JOIN INVOICE_LINE IL
ON E.EXPENSE_ID = IL.INVOICE_LINE_EXPENSE_ID
UNION
SELECT E.*, IL.INVOICE_LINE_ID, IL.INVOICE_LINE_INVOICE_ID
FROM EXPENSE E
RIGHT JOIN INVOICE_LINE IL
ON E.EXPENSE_ID = IL.INVOICE_LINE_EXPENSE_ID;

And then, reuse the temporary table in both of your queries across which you are applying a UNION. 然后,在要应用UNION的两个查询中重用临时表。

SELECT A.*, I.INVOICE_STATUS
FROM CTE_MYSQL_TABLE
LEFT JOIN INVOICE I
ON A.INVOICE_LINE_INVOICE_ID = I.INVOICE_ID
UNION
SELECT A.*, I.INVOICE_STATUS, I.INVOICE_DUE_DATE
FROM CTE_MYSQL_TABLE
RIGHT JOIN INVOICE I
ON A.INVOICE_LINE_INVOICE_ID = I.INVOICE_ID;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM