从另一个表中匹配标准中选择一个?

时间:2011-03-27 02:15:10

标签: sql multiple-tables

我非常感谢对表间的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

或者,是否有更好的方法来组织数据?

4 个答案:

答案 0 :(得分:88)

最简单的解决方案是相关子选择

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

或者,您可以加入表格并过滤所需的行:

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

您应该对两者进行分析,并查看数据集中哪个更快。

答案 1 :(得分:8)

您应该使用链接表为自己的表做标记。

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

答案 2 :(得分:3)

select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = 'chair';

答案 3 :(得分:0)

我有类似的问题(至少我认为它是相似的)。在其中一个答复中,解决方案如下:

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所示的期间内提取这些数据。