0

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

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

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

我的意图是检索所有含有维生素A 和维生素B 且价格低于30 的水果。SQL 中有没有一种方法可以回答这个查询?

4

2 回答 2

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)

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

于 2013-03-27T23:05:07.193 回答
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

或者您可以使用一个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

附带说明一下,您当前的数据结构很难使用。如果可能,您可能需要考虑重组您的表格。

于 2013-03-27T23:12:58.870 回答