有没有更好的方法来编写此Oracle SQL查询?

时间:2014-07-16 09:17:19

标签: sql oracle

我一直在使用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专家!

1 个答案:

答案 0 :(得分:4)

您可以使用连接重写它。如果您的子选择不会返回任何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

或者,如果您在所有表格中都没有匹配项,则可以使用INNER联接替换LEFT OUTER联接:

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

您是否看到任何性能提升是值得商榷的。据我了解,Oracle查询优化器接受您的查询并使用与连接查询类似的计划执行它,但这取决于许多因素,因此最好的做法是试试..