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 に答える