2011-10-17 61 views
1

我在我的应用程序的一部分中使用了这个语句,它的生成。 LIKE'%%'是空的,因为没有搜索参数发送给它,所以它拉入所有结果。DB2 SQL技巧/提示

我仍然是整个数据库的新手,并想知道是否有任何提示改善我的声明?

我相信它看起来很可怕,但请容易对我!

更新:我主要希望从中获得更好的表现。我已经使用过DB2顾问并创建了我应该说的关键字。这帮助了一些,但仍然比我预期的要慢。

谢谢。

SELECT * FROM 
(
    SELECT rownumber() OVER (ORDER BY pgmajdsc, item) AS ROW_NUM, 
    line, item, pgmajdsc, manufacturer 
    FROM 
    (
     SELECT iline AS line, iitem AS item, pgmajdsc, ldesc AS manufacturer 
     FROM itemmast 
     LEFT JOIN itemweb on iline=line and iitem=item 
     JOIN linemst ON iline=lline 
     LEFT JOIN custord ON opline=iline AND opitem=iitem AND opcust='1234' 
     LEFT JOIN cartwdtl ON cwline=iline and cwitem=iitem and cwusr='foo' AND cwcust='1234' 
     LEFT JOIN itematr ON iline=ialine AND iitem=iaitem 
     LEFT JOIN prodgrp ON iaclass=pgclass 
     WHERE ico = 01 
     AND iecomm = 'Y' 
     AND (UPPER(ITEMDESC) LIKE '%%' OR UPPER(PRODDESC) LIKE '%%' OR 
      LINE LIKE '%%' OR UPPER(MFGNAME) LIKE '%%' OR ITEM LIKE '%%' OR 
      PRODNAME LIKE '%%' OR IDESC1 LIKE '%%' OR IDESC2 LIKE '%%' OR 
      IMFGNO LIKE '%%' OR IITEM LIKE '%%') 
    ) AS TEMP 
) AS ROW_NUM 
WHERE ROW_NUM BETWEEN 0 AND 25 
ORDER BY pgmajdsc, item 
+1

除了格式化之外还想改进什么? –

+0

您可以尝试将其分离为不同的行,以便更易读:D – Ruben

+0

@Bead不用说您应该重新格式化此查询,以便它可以被人类以及DB2的解析器解释。除此之外,你需要重新解释这个问题,以便**问**一个具体的问题。目前还不清楚你试图回答什么。 –

回答

1

假设你使用的是参数类似条款我会改变的第一件事就是语句来检查它是否为空,就会避免所有其他比较。另一个改变是去除嵌套。您可以通过使用提取第一个子句达到相同的效果(我认为无论如何)。

注意:这是未经测试的,因为此刻我没有数据库在我面前,但我确定它会工作。

SELECT rownumber() OVER (ORDER BY pgmajdsc, item) AS ROW_NUM, 
     iline AS line, iitem AS item, pgmajdsc, ldesc AS manufacturer 
FROM itemmast 
    LEFT JOIN itemweb on iline=line and iitem=item 
    JOIN linemst ON iline=lline 
    LEFT JOIN custord ON opline=iline AND opitem=iitem AND opcust='1234' 
    LEFT JOIN cartwdtl ON cwline=iline and cwitem=iitem and cwusr='foo' AND cwcust='1234' 
    LEFT JOIN itematr ON iline=ialine AND iitem=iaitem 
    LEFT JOIN prodgrp ON iaclass=pgclass 
WHERE ico = 01 
    AND iecomm = 'Y' 
    AND (parameter IS NULL 
     OR (UPPER(ITEMDESC) LIKE '%'||parameter||'%' 
     OR UPPER(PRODDESC) LIKE '%'||parameter||'%' 
     OR LINE LIKE '%'||parameter||'%' 
     OR UPPER(MFGNAME) LIKE '%'||parameter||'%' 
     OR ITEM LIKE '%'||parameter||'%' 
     OR PRODNAME LIKE '%'||parameter||'%' 
     OR IDESC1 LIKE '%'||parameter||'%' 
     OR IDESC2 LIKE '%'||parameter||'%' 
     OR IMFGNO LIKE '%'||parameter||'%' 
     OR IITEM LIKE '%'||parameter||'%')) 
ORDER BY ROW_NUM, pgmajdsc, item 
FETCH FIRST 25 ROWS ONLY 

编辑:另一个想法是,除非你真正需要的行号,你可以离开了这一点,只是通过像做你为了这样:

SELECT iline AS line, iitem AS item, pgmajdsc, ldesc AS manufacturer 
FROM itemmast 
    LEFT JOIN itemweb on iline=line and iitem=item 
    JOIN linemst ON iline=lline 
    LEFT JOIN custord ON opline=iline AND opitem=iitem AND opcust='1234' 
    LEFT JOIN cartwdtl ON cwline=iline and cwitem=iitem and cwusr='foo' AND cwcust='1234' 
    LEFT JOIN itematr ON iline=ialine AND iitem=iaitem 
    LEFT JOIN prodgrp ON iaclass=pgclass 
WHERE ico = 01 
    AND iecomm = 'Y' 
    AND (parameter IS NULL 
     OR (UPPER(ITEMDESC) LIKE '%'||parameter||'%' 
     OR UPPER(PRODDESC) LIKE '%'||parameter||'%' 
     OR LINE LIKE '%'||parameter||'%' 
     OR UPPER(MFGNAME) LIKE '%'||parameter||'%' 
     OR ITEM LIKE '%'||parameter||'%' 
     OR PRODNAME LIKE '%'||parameter||'%' 
     OR IDESC1 LIKE '%'||parameter||'%' 
     OR IDESC2 LIKE '%'||parameter||'%' 
     OR IMFGNO LIKE '%'||parameter||'%' 
     OR IITEM LIKE '%'||parameter||'%')) 
ORDER BY pgmajdsc, item 
FETCH FIRST 25 ROWS ONLY 

我不知道有多少对性能命中正在计算rownumber,但如果你不需要它,不需要返回它。

+0

以及我确实使用了WHERE ROW_NUM BETWEEN 0和25,我会根据用户在哪个页面上进行更改,因此下一个可能是26-50。 – Bead

+0

请注意,SQL标准(以及DB2)并不遵循短路逻辑;事实上,[手册](http://tinyurl.com/6ay2mqc)第201页(假设为iSeries)声明'括号内的条件首先被评估'。尽管如此,我仍然可以按照以下方式构建语句:它允许基于参数的存在将条件转为“关闭”,而不诉诸动态SQL(优化程序似乎能够识别这一点,并做出适当的响应,无论如何)。 –