59

对于跨表的 SQL 查询,我真的很感激。我意识到这种事情经常被问到,但我找不到足够相似的问题来理解答案。

我想从中选择table_A具有相应标记的行table_B
因此,例如,“选择table_a标记为 'chair' 的行”将返回table_C.

此外,id是唯一的table_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

4 回答 4

125

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

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'

您应该对两者进行分析,看看哪个在您的数据集上更快。

于 2011-03-27T02:21:16.897 回答
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
于 2011-03-27T02:22:36.900 回答
3
select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = 'chair';
于 2011-03-27T02:21:36.923 回答
2

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

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

于 2018-05-25T06:07:24.443 回答