查询有关SQL查询的形成

时间:2013-03-27 22:56:21

标签: sql postgresql

我有一个巨大的表格,其中包含以下表格的数据:

Id Col1  Col2      Col3
------------------------
a Fruit1 vitaminA vitaminB 
b a      price       "30"     

现在我要在SQL中检索含有维生素A和维生素B的所有水果,其价格低于30。这里'a'是给Fruit1的id。 Fruit1含有维生素A和维生素B.现在,下一行表示id'a'的价格为30。

我的目的是检索所有含有维生素A和维生素B且价格低于30的水果。在SQL中我有什么方法可以回答这个问题吗?

2 个答案:

答案 0 :(得分:1)

你需要为此加入:

select t.col1
from t join
     t tprice
     on t.id = tprice.col1 and
        tprice.col2 = 'price'
where ((t.col2 = 'VitaminA' and t.col3 = 'VitaminB') or
       (t.col2 = 'VitaminB' and t.col3 = 'VitaminA')
      ) and
      (cast(tprice.col3 as int) <= 30)

这是一个非常神秘的数据结构。你能解释它的来源吗?

答案 1 :(得分:1)

您必须在桌面上使用自我联接才能获得结果。

select t1.id
from yourtable t1
inner join yourtable t2
  on t1.id = t2.col1
where 
(
  t1.col2 = 'vitaminA' and t1.col3 = 'vitaminB'
  or t1.col2 = 'vitaminB' and t1.col3 = 'vitaminA'
)
  and t2.col2 = 'price'
  and cast(t2.col3 as int) < '30';

请参阅SQL Fiddle with Demo

或者您可以使用WHERE来使用EXISTS子句:

select t1.id
from yourtable t1
where 
(
  t1.col2 = 'vitaminA' and t1.col3 = 'vitaminB'
  or t1.col2 = 'vitaminB' and t1.col3 = 'vitaminA'
)
  and exists (select t2.col1
              from yourtable t2
              where t2.col2 = 'price'
                and cast(t2.col3 as int) < 30
                and t1.id = t2.col1)

请参阅SQL Fiddle with Demo

作为旁注,您当前的数据结构非常难以使用。如果可能,您可能需要考虑重组表格。