2009-12-08 81 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