我有一个巨大的表格,其中包含以下表格的数据:
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中我有什么方法可以回答这个问题吗?
答案 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';
或者您可以使用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)
作为旁注,您当前的数据结构非常难以使用。如果可能,您可能需要考虑重组表格。