[英]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.