我非常感谢对表间的SQL查询提供一些帮助。我意识到这种事情经常被问到,但我找不到类似的问题来理解答案。
我想从table_A
中选择具有table_B
中相应标记的行
因此,例如,“从table_a
中选择标记为”主席“的行将返回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
或者,是否有更好的方法来组织数据?
答案 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所示的期间内提取这些数据。