web-dev-qa-db-ja.com

別のテーブルに一致するテーブルを選択しますか?

複数のテーブルにまたがるSQLクエリの助けを本当に感謝します。この種のことは絶えず尋ねられますが、答えを理解するのに十分な同様の質問を見つけることができません。

table_Aに対応するタグがあるtable_Bから行を選択したい。
たとえば、「「椅子」とタグ付けされたtable_aから行を選択すると、table_Cが返されます。

また、idtable_aではなくtable_bで一意です。

table_A:             table_B:                  table_C:

id    object         id    tag                 id    object
1     lamp           1     furniture           3     stool
2     table          2     furniture           4     bench
3     stool          3     furniture
4     bench          4     furniture
                     4     chair
                     3     chair

または、データを整理するより良い方法はありますか?

41
user668660

最も簡単な解決策は、相関サブセレクト

select
    A.*
from
    table_A A
where
    A.id in (
        select B.id from table_B B where B.tag = 'chair'
)

または、joinテーブルを使用して、必要な行をフィルタリングすることもできます。

select
    A.*
from
    table_A A
inner join table_B B
    on A.id = B.id
where
    B.tag = 'chair'

両方のプロファイルを作成し、データセットでどちらが速いかを確認する必要があります。

92
Chris Nava

リンクテーブルを使用して、タグを独自のテーブルにする必要があります。

items:
id    object
1     lamp  
2     table   
3     stool  
4     bench 

tags:
id     tag
1      furniture
2      chair

items_tags:
item_id tag_id
1       1
2       1
3       1
4       1
3       2
4       2
8
rjschnorenberg
select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = 'chair';
3
RichardTheKiwi

私は似たような問題を抱えています(少なくとも似ていると思います)。ここでの回答の1つでは、解決策は次のとおりです。

select
    A.*
from
    table_A A
inner join table_B B
    on A.id = B.id
where
    B.tag = 'chair'

私がなりたいWHERE句:

WHERE B.tag = A.<col_name>

または、私の特定の場合:

WHERE B.val BETWEEN A.val1 AND A.val2

より詳細な:

表Aには、機器群のステータス情報が記載されています。各ステータスレコードには、そのステータスの開始時刻と終了時刻が記録されています。表Bには、機器について定期的に記録されたタイムスタンプ付きのデータが含まれています。これは、表Aに示されている期間中に抽出したいものです。

0
KohanJ