2012-08-14 80 views
2

我在下面写了查询,它返回我需要的数据。但是,我不禁想到还有更好的方法来编写它。我需要的是找到Table1中的所有唯一行,其价格大于指定供应商在供应商所属类别中的价格。 (理论上,供应商可以属于的类别数量不受限制)。同一列的多个WHERE子句

  • 表1是含有VendorIDCategory,和price
  • 一个交叉引用表表2中包含的供应商信息
  • 有包含类别名的类别表。

...

SELECT DISTINCT Table2.name, Table2.city, Table2.state 
FROM Table1 INNER JOIN Table2 ON Table1.VendorID = Table2.VendorID 
WHERE Table1.Category IN (49,50,45) 
    AND Table1.price > (SELECT price FROM Table1 WHERE VendorID = 69041 AND Category = 50) 
    AND Table1.price > (SELECT price FROM Table1 WHERE VendorID = 69041 AND Category = 49) 
    AND Table1.price > (SELECT price FROM Table1 WHERE VendorID = 69041 AND Category = 45) 
+0

类别表有vendoid吗? – AnandPhadke 2012-08-14 03:49:54

+0

否。分类表只是一个类别和标识列表。 – RHPT 2012-08-14 14:56:55

回答

4

你可以使用一个公用表表达式或子查询中,你首先需要的所有数据,以拉,然后加入你的表到“查看”:

;WITH MaxPricePerCategory 
AS 
    (
    SELECT MAX(Price) AS [Price] 
     -- You can remove category if you just need the maximum price 
     , Category 
    FROM Table1 
    WHERE VendorID = 69041 
    AND Table1.Category IN (49,50,45) 
    GROUP BY Category 
    ) 
SELECT DISTINCT Table2.name 
    , Table2.city 
    , Table2.state 
FROM Table1 
JOIN Table2 
    ON Table1.VendorID = Table2.VendorID 
JOIN MaxPricePerCategory MPPC 
    ON Table1.Category = MPPC.Category 
     AND Table1.price > MPPC.Price 
4

也许只是最大值吗?

SELECT DISTINCT Table2.name, Table2.city, Table2.state 
FROM Table1 INNER JOIN Table2 ON Table1.VendorID = Table2.VendorID 
WHERE Table1.Category IN (49,50,45) 
    AND Table1.price > (SELECT MAX(price) FROM Table1 WHERE VendorID = 69041 AND Category = IN (49,50,45))