2009-12-08 78 views
0

出於某種原因,我無法獲得結果集以限制僅具有「普通」價格狀態的產品。當我使用如where pricestatus like 'normal'這樣的where子句時,結果集也會過濾其他記錄。這裏的任何想法?無法過濾SQL Server查詢中設置的結果

SELECT 
    od.order_id, 
    ISNULL(p.pricestatus,'normal') as pricestatus, 
    ISNULL(od.partnumber,'unknown') as partnumber, 
    od.product_id, 
    od.producttitle, 
    qty, 
    od.price, 
    extprice, 
    customfield1 AS prodstatus, 
    ISNULL(categorytitle,'-') AS categorytitle, 
    needbydate, 
    customfield2 AS vendor, 
    (SELECT opttitle 
     FROM options o 
    WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
      AND optlevel = 1) AS color, 
    (SELECT opttitle 
     FROM options o 
    WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
      AND optlevel = 2) AS size, 
    od.producttitle + ISNULL((SELECT opttitle 
           FROM options o 
           WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
           AND optlevel = 1),'') + ISNULL((SELECT opttitle 
                    FROM options o 
                   WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
                    AND optlevel = 2),'') + Cast(od.price AS VARCHAR(15)) AS pkey 

FROM  
    orderdetails od 
    INNER JOIN orders ord ON ord.order_id = od.order_id 
    LEFT OUTER JOIN products p ON p.product_id = od.product_id 
    LEFT OUTER JOIN objectgroups ob ON p.objectgroup_id = ob.objectgroup_id 
    LEFT OUTER JOIN categories c ON ob.category_id = c.category_id 
WHERE 
    1=1 
    AND ord.shippingdate BETWEEN {ts '2009-10-05 00:01:00'} AND {ts '2009-10-21 23:59:59'} 
    AND ISNULL(ord.status,0) IN (5,12) 
    AND ISNULL(ord.status,0) <> 6 
    AND ISNULL(ord.status,0) <> 10 
    AND ISNULL(ord.status,0) <> 7 
    AND ISNULL(ord.status,0) <> 8 
ORDER BY 
    pkey 

回答

3

末您正在對產品執行左外連接。請記住,如果您在WHERE子句中添加條件,則會將該條件應用於WHOLE集合,因此任何不會帶回產品的行都會自動過濾掉,因爲您的條件不成立。

您需要的條件添加到您的加入,而不是:

LEFT OUTER JOIN products p 
    ON p.product_id = od.product_id AND p.priceStatus LIKE "%normal%' 
+0

你這人賈斯汀。你解決了我的問題。 – jeff 2009-12-08 16:01:47

+0

不客氣,傑夫:) – 2009-12-08 16:21:24

1

什麼是數據是什麼樣子?除非數據是準確的文本普通,你會不會拿起正常的變化。

試試下面的不是

WHERE priceStatus LIKE "%normal%' 

,如果你想NULL記錄,以及使用

WHERE PriceStatus LIKE '%normal%' or PriceStatus is NULL 
0

我認爲你需要把它添加到您的where子句

and isnull(p.pricestatus,'normal') = 'normal' 

像這樣

SELECT od.order_id, 
Isnull(p.pricestatus,'normal') as pricestatus, 
     Isnull(od.partnumber,'unknown') as partnumber, 

    od.product_id, 
    od.producttitle, 
    qty, 
    od.price, 
    extprice, 
    customfield1                             AS prodstatus, 
    Isnull(categorytitle,'-')                          AS categorytitle, 
    needbydate, 
    customfield2                             AS vendor, 
    (SELECT opttitle 
     FROM options o 
     WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
      AND optlevel = 1) AS color, 
    (SELECT opttitle 
     FROM options o 
     WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
      AND optlevel = 2) AS size, 
    od.producttitle + Isnull((SELECT opttitle 
           FROM options o 
           WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
             AND optlevel = 1),'') + Isnull((SELECT opttitle 
                     FROM options o 
                     WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
                      AND optlevel = 2),'') + Cast(od.price AS VARCHAR(15)) AS pkey 


FROM  orderdetails od 
    INNER JOIN orders ord 
     ON ord.order_id = od.order_id 
    LEFT OUTER JOIN products p 
     ON p.product_id = od.product_id 



    LEFT OUTER JOIN objectgroups ob 
     ON p.objectgroup_id = ob.objectgroup_id 
    LEFT OUTER JOIN categories c 
     ON ob.category_id = c.category_id 
WHERE 1=1 



    and isnull(p.pricestatus,'normal') = 'normal' 
    AND ord.shippingdate BETWEEN {ts '2009-10-05 00:01:00'} AND {ts '2009-10-21 23:59:59'} 
    AND Isnull(ord.status,0) IN (5,12) 
    AND Isnull(ord.status,0) <> 6 
    AND Isnull(ord.status,0) <> 10 
    AND Isnull(ord.status,0) <> 7 
    AND Isnull(ord.status,0) <> 8 


ORDER BY pkey