我正在查詢以獲取發票的付款。但因為我可以擁有多張卡、應收賬款和貨幣(現金和零錢)。是否可以在不使用函式、聯合和子查詢的情況下完成這項作業?所有表都有 300k 記錄,我想制作一個易于使用/維護的視圖。但是,當我在視圖上使用 union 時,性能急劇下降
以下示例
發票
| 發票 |
|---|
| 113806 |
發票 -> 條目
| 發票 | ID_ENTRY |
|---|---|
| 113806 | 387473 |
應收賬款
| ID_ENTRY | ID_AR | 由于 |
|---|---|---|
| 387473 | 31014 | 15/05/2022 |
| 387473 | 31015 | 15/06/2022 |
卡片
| ID_ENTRY | 身份證 | 由于 |
|---|---|---|
| 387473 | 407214 | 2022 年 1 月 1 日 |
現金
| ID_ENTRY | ID_CASH | 價值 |
|---|---|---|
| 387473 | 407214 | 10 |
| 387473 | 407215 | -5 |
詢問
SELECT NAF.INVOICE_ENTRY, ADRE.ID_AR, ACAR.ID_CARD, ADIN.ID_CASH
FROM INVOICE N
INNER JOIN INVOICE_ENTRY NAF
ON NAF.ID_INVOICE = N.ID_INVOICE
LEFT JOIN AR_ENTRY ADRE
ON ADRE.ID_ENTRY = NAF.ID_ENTRY
LEFT JOIN CARD_ENTRY ACAR
ON ACAR.ID_ENTRY = NAF.ID_ENTRY
LEFT JOIN CASH_ENTRY ADIN
ON ADIN.ID_ENTRY = NAF.ID_ENTRY
WHERE N.ID_INVOICE = :ID_INVOICE
結果
| ID_ENTRY | ID_AR | 身份證 | ID_CASH |
|---|---|---|---|
| 387473 | 31014 | 221396 | 407214 |
| 387473 | 31014 | 221396 | 407215 |
| 387473 | 31015 | 221396 | 407214 |
| 387473 | 31015 | 221396 | 407215 |
預期結果
| 艾瑟芬 | 國際開發署 | 身份證 | IDDIN |
|---|---|---|---|
| 387473 | 31014 | 空值 | 空值 |
| 387473 | 31015 | 空值 | 空值 |
| 387473 | 空值 | 221396 | 空值 |
| 387473 | 空值 | 空值 | 407214 |
| 387473 | 空值 | 空值 | 407215 |
uj5u.com熱心網友回復:
您可以UNION ALL在accounts_receivable,cash和card表上使用,然后將結果連接到其他表:
SELECT u.*
FROM invoice i
INNER JOIN entry e
ON (i.invoice = e.invoice)
INNER JOIN (
SELECT id_entry AS acerfin, id_ar AS idad, NULL AS idcar, NULL AS iddin
FROM accounts_receivable
UNION ALL
SELECT id_entry, NULL, id_card, NULL
FROM card
UNION ALL
SELECT id_entry, NULL, NULL, id_cash
FROM cash
) u
ON (e.id_entry = u.acerfin)
WHERE i.invoice = 113806
其中,對于樣本資料:
CREATE TABLE invoice (INVOICE) AS
SELECT 113806 FROM DUAL;
CREATE TABLE entry (INVOICE, ID_ENTRY) AS
SELECT 113806, 387473 FROM DUAL;
CREATE TABLE Accounts_Receivable (ID_ENTRY, ID_AR, DUE_TO) AS
SELECT 387473, 31014, DATE '2022-05-15' FROM DUAL UNION ALL
SELECT 387473, 31015, DATE '2022-06-15' FROM DUAL;
CREATE TABLE Card (ID_ENTRY, ID_CARD, DUE_TO) AS
SELECT 387473, 407214, DATE '2022-05-01' FROM DUAL;
CREATE TABLE Cash (ID_ENTRY, ID_CASH, VALUE) AS
SELECT 387473, 407214, 10 FROM DUAL UNION ALL
SELECT 387473, 407215, -5 FROM DUAL;
輸出:
艾瑟芬 國際開發署 身份證 IDDIN 387473 31014 空值 空值 387473 31015 空值 空值 387473 空值 407214 空值 387473 空值 空值 407214 387473 空值 空值 407215
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428237.html
上一篇:為什么在我輸入控制臺命令之前沒有創建我的Rails7連接表?
下一篇:SQL比較2個連接到同一個表
