我正在嘗試顯示一個包含從 4 個不同表中收集的資訊的表。
| orden_trabajo_pk | 概念 | 描述 | 進口 | ing_responsable_id |
|---|---|---|---|---|
| 159460 | 概念示例1 | 描述 | 18000 | 1 |
| 159461 | 概念示例2 | 描述 | 8000 | 1 |
| cotizacion_pk | 概念 | 描述 | 進口 | orden_trabajo_id |
|---|---|---|---|---|
| 2010633 | 概念示例1 | 描述 | 20000 | 159460 |
| factura_cliente_pk | 費查 | 進口 | orden_trabajo_id |
|---|---|---|---|
| A812 | 2022-10-15 | 19000 | 159460 |
| ing_responsable_pk | 名詞 | 電話 | 植物_id |
|---|---|---|---|
| 1 | 紐達里 | 123 | 1 |
我在下一個方式使用 2 個右連接和 1 個左連接:
SELECT orden_trabajo.orden_trabajo_pk, orden_trabajo.concepto, orden_trabajo.importe, cotizacion.cotizacion_pk, cotizacion.importe, factura_cliente.factura_cliente_pk,factura_cliente.importe, ing_responsable.nombre, ing_responsable.telefono, factura_cliente.fecha
FROM orden_trabajo
RIGHT JOIN cotizacion
ON cotizacion.orden_trabajo_id = orden_trabajo.orden_trabajo_pk
RIGHT JOIN factura_cliente
ON factura_cliente.orden_trabajo_id = orden_trabajo.orden_trabajo_pk
LEFT JOIN ing_responsable
ON orden_trabajo.ing_responsable_id = ing_responsable.ing_responsable_pk
它顯示了我要查看的表格,但是我希望它創建另一行,其中第二個“orden_trabajo_pk”(159461)下一個單元格為空
這是我得到的表格示例:
| 第1行 | 行h2 | 行h3 | 行h4 | 第5行 | 行h6 | 行7 | 第8行 | 行h9 | 行10 |
|---|---|---|---|---|---|---|---|---|---|
| 資料1 | 資料2 | 資料3 | 資料4 | 資料5 | 資料6 | 資料7 | 資料8 | 資料9 | 資料10 |
這是我想要的桌子
| 第1行 | 行h2 | 行h3 | 行h4 | 第5行 | 行h6 | 行7 | 第8行 | 行h9 | 行10 |
|---|---|---|---|---|---|---|---|---|---|
| 資料1 | 資料2 | 資料3 | 資料4 | 資料5 | 資料6 | 資料7 | 資料8 | 資料9 | 資料10 |
| 資料1.1 | 資料2.1 | 資料3.1 |
有沒有辦法讓它顯示“不完整”的行?
uj5u.com熱心網友回復:
由于正確的連接,您使用的查詢在語意上等同于:
SELECT orden_trabajo_pk,
orden_trabajo.concepto,
orden_trabajo.importe,
cotizacion_pk,
cotizacion.importe,
factura_cliente_pk,
factura_cliente.importe,
nombre,
ing_responsable.telefono,
fecha
FROM factura_cliente
LEFT JOIN orden_trabajo
ON factura_cliente.orden_trabajo_id = orden_trabajo_pk
LEFT JOIN cotizacion
ON cotizacion.orden_trabajo_id = orden_trabajo_pk
LEFT JOIN ing_responsable
ON ing_responsable_id = ing_responsable_pk;
因此,您從factura_cliente只包含orden_trabajo_id(159460) 的值之一的記錄開始,orden_trabajo不會回傳另一條記錄。
您只需將右連接更改為左連接即可獲得所需的結果:
SELECT orden_trabajo_pk,
orden_trabajo.concepto,
orden_trabajo.importe,
cotizacion_pk,
cotizacion.importe,
factura_cliente_pk,
factura_cliente.importe,
nombre,
ing_responsable.telefono,
fecha
FROM orden_trabajo
LEFT JOIN cotizacion
ON cotizacion.orden_trabajo_id = orden_trabajo_pk
LEFT JOIN factura_cliente
ON factura_cliente.orden_trabajo_id = orden_trabajo_pk
LEFT JOIN ing_responsable
ON ing_responsable_id = ing_responsable_pk;
db<>fiddle 上的演示
正如評論中所述,我誠實的建議是避開RIGHT JOINs。它們是您出現此問題的原因,最終任何時候您使用 aRIGHT JOIN查詢都可以通過更改表的順序并使用LEFT JOIN.
作為最后一點,我還建議使用別名,這可能有點主觀,但我認為大多數人會同意它使您的查詢更快輸入,更易于閱讀,例如
SELECT o.orden_trabajo_pk,
o.concepto,
o.importe,
c.cotizacion_pk,
c.importe,
f.factura_cliente_pk,
f.importe,
i.nombre,
i.telefono,
f.fecha
FROM orden_trabajo AS o
LEFT JOIN cotizacion AS c
ON c.orden_trabajo_id = o.orden_trabajo_pk
LEFT JOIN factura_cliente AS f
ON f.orden_trabajo_id = o.orden_trabajo_pk
LEFT JOIN ing_responsable AS i
ON i.ing_responsable_pk = o.ing_responsable_id;
uj5u.com熱心網友回復:
看來這應該適合您作為您所需輸出的解決方案。
SELECT
ot.orden_trabajo_pk,
ot.concepto,
ot.importe,
c.cotizacion_pk,
c.importe,
fc.factura_cliente_pk,
fc.importe,
ir.nombre,
ir.tel,
fc.fecha
From orden_trabajo ot
LEFT JOIN cotizacion c
ON ot.orden_trabajo_pk = c.orden_trabajo_id
LEFT JOIN factura_cliente fc
ON ot.orden_trabajo_pk = fc.orden_trabajo_id
LEFT JOIN ing_responsable ir
ON ot.ing_responsable_id = ir.ing_responsable_pk
ORDER BY ot.orden_trabajo_pk ASC
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/516889.html
