簡體   English   中英

有沒有更好的方法編寫此Oracle SQL查詢?

[英]Is there a better way to write this Oracle SQL query?

我已經使用Oracle SQL大約6個月了,所以還是一個初學者。 我需要查詢數據庫以獲取有關特定訂單上所有項目的信息(訂單號通過$_GET['id'] )。

我想出了以下查詢, 它可以按預期和我需要的方式工作,但我不知道我是否在使事情變慢的情況下過度復雜。 我知道有很多方法可以做一件事情,而且由於我是初學者,因此可能有更好的方法編寫此查詢。

我正在使用Oracle 8i(由於這是我們使用的應用程序所提供的版本),因此我相信在此版本中不提供某些JOIN等,但是有沒有更好的方法來編寫諸如以下的查詢

SELECT auf_pos.auf_pos,
       (SELECT auf_stat.anz
        FROM   auf_stat
        WHERE  auf_stat.auf_pos = auf_pos.auf_pos
               AND auf_stat.auf_nr = ".$_GET['id']."),
       (SELECT auf_text.zl_str
        FROM   auf_text
        WHERE  auf_text.zl_mod = 0
               AND auf_text.auf_pos = auf_pos.auf_pos
               AND auf_text.auf_nr = ".$_GET['id']."),
       (SELECT glas_daten_basis.gl_bez
        FROM   glas_daten_basis
        WHERE  glas_daten_basis.idnr = auf_pos.glas1),
       (SELECT lzr_daten.lzr_breite
        FROM   lzr_daten
        WHERE  lzr_daten.lzr_idnr = auf_pos.lzr1),
       (SELECT glas_daten_basis.gl_bez
        FROM   glas_daten_basis
        WHERE  glas_daten_basis.idnr = auf_pos.glas2),
       auf_pos.breite,
       auf_pos.hoehe,
       auf_pos.spr_jn
FROM   auf_pos
WHERE  auf_pos.auf_nr = ".$_GET['id']."

在此先感謝任何可以幫助此初學者的Oracle專家!

您可以使用聯接重寫它。 如果您的子選擇不希望返回任何NULL值,則可以使用INNER JOINS

SELECT auf_pos.auf_pos,
       auf_stat.anz,
       auf_text.zl_str,
       glas_daten_basis.gl_bez,
       lzr_daten.lzr_breite,
       glas_daten_basis.gl_bez,
       auf_pos.breite,
       auf_pos.hoehe,
       auf_pos.spr_jn
FROM   auf_pos
INNER JOIN auf_stat ON auf_stat.auf_pos = auf_pos.auf_pos AND auf_stat.auf_nr = ".$_GET['id'].")
INNER JOIN auf_text ON auf_text.zl_mod = 0 AND auf_text.auf_pos = auf_pos.auf_pos AND auf_text.auf_nr = ".$_GET['id'].")
INNER JOIN glas_daten_basis ON glas_daten_basis.idnr = auf_pos.glas1
INNER JOIN lzr_daten ON lzr_daten.lzr_idnr = auf_pos.lzr1
INNER JOIN glas_daten_basis ON glas_daten_basis.idnr = auf_pos.glas2

或者,如果在某些情況下所有表都不匹配,則可以用LEFT OUTER聯接替換INNER聯接:

SELECT auf_pos.auf_pos,
       auf_stat.anz,
       auf_text.zl_str,
       glas_daten_basis.gl_bez,
       lzr_daten.lzr_breite,
       glas_daten_basis.gl_bez,
       auf_pos.breite,
       auf_pos.hoehe,
       auf_pos.spr_jn
FROM   auf_pos
LEFT OUTER JOIN auf_stat ON auf_stat.auf_pos = auf_pos.auf_pos AND auf_stat.auf_nr = ".$_GET['id'].")
LEFT OUTER JOIN auf_text ON auf_text.zl_mod = 0 AND auf_text.auf_pos = auf_pos.auf_pos AND auf_text.auf_nr = ".$_GET['id'].")
LEFT OUTER JOIN glas_daten_basis ON glas_daten_basis.idnr = auf_pos.glas1
LEFT OUTER JOIN lzr_daten ON lzr_daten.lzr_idnr = auf_pos.lzr1
LEFT OUTER JOIN glas_daten_basis ON glas_daten_basis.idnr = auf_pos.glas2

您是否看到任何性能提升值得商bat。 據我了解,Oracle查詢優化器應該接受您的查詢並以與聯接查詢類似的計划執行它,但這取決於許多因素,因此,最好的辦法是嘗試一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM