簡體   English   中英

MySQL-重用嵌套的select語句

[英]MySQL - reuse nested select statement

我想知道是否存在一種更有效的方式來編寫以下查詢(請注意重復使用導致A的同一select語句)。 我不會對此太擔心,但是我需要為此添加一個或兩個以上的“父”級別,這似乎比我的幼稚方法要好。

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;

謝謝!

在Oracle中,可以使用WITH關鍵字創建所謂的公用表表達式。 其工作方式如下:

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

在MySQL中,您沒有像在Oracle中那樣奢侈。 因此,您將執行以下操作:

創建一個過程來創建一個臨時表,該表存儲以下結果集:

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;

然后,在要應用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