使用ELANCE中的UNION运算符的SQL

时间:2012-02-11 21:03:38

标签: sql oracle

  

可能重复:
  except condition in mysql query..

考虑一个名为carrecords的表,其结构如下:

名称(类型:TEXT) 价格(类型:INT) 颜色(类型:TEXT) vehicletype(类型:TEXT)例如。 SEDAN / SUV

客户希望查看符合其偏好的车辆的详细信息(名称,价格,颜色,车型)。这就是他所说的:

“如果它是黑色轿车,我准备支付10,000,但如果是红色或白色,那么不超过8,000。对于任何其他颜色,我不会超过7,000,除非它是一辆SUV,在哪种情况下,黑色的预算高达15,000或任何其他颜色高达14,000。“

编写一个查询,按价格的升序返回所需信息。

我的解决方案如下。

SELECT *
FROM carrecords
WHERE name='SEDAN' 
     AND  color='black'
     AND price=10000
UNION
SELECT *
FROM carrecords
WHERE name='SEDAN'
      AND color='RED' OR color='WHITE'
      AND price<=8000
UNION
SELECT * 
FROM carrecords
WHERE name='SEDAN'
     AND color!='BLACK'
     AND price<=7000
UNION
SELECT *
FROM carrecords
WHERE name='SUV'
      AND color='BLACK'
      AND price<=15000
UNION
SELECT * 
FROM carrecords
WHERE name='SUV'
     AND color!='BLACK'
     AND price<=14000
ORDER BY price;

2 个答案:

答案 0 :(得分:1)

我认为值'SUV'和'SEDAN'在'type'列中,而不在'name'列中。另外,你可以像这样简洁地写出来:

SELECT *
FROM carrecords
WHERE (type='SEDAN' 
     AND ((color='BLACK'
          AND price<=10000)
     OR (color IN ('RED', 'WHITE')
          AND price<=8000)
     OR (color NOT IN ('BLACK', 'RED', 'WHITE')
          AND price<=7000)))
     OR
     (type='SUV' 
     AND ((color='BLACK'
          AND price<=15000)
     OR (color != 'BLACK'
         AND price<=14000))
ORDER BY price

答案 1 :(得分:0)

实际上,你可以在没有联盟的情况下做到这一点:

Select * from carrecords
where (type='Sudan' AND price <= 7000) 
OR (type='Sudan' and color in ('Red','White') and price <= 8000) 
OR (type='Sudan' AND color = 'Black' AND price <= 10000)
OR (type='SUV' and price <=14000)
OR (type='SUV' and color='Black' and price <=15000)
order by price