Sql 从一个表中选择另一个表中的匹配条件?
我非常感谢您对跨表SQL查询的帮助。我意识到这类问题经常被问到,但我找不到一个足够类似的问题来解释答案 我想从Sql 从一个表中选择另一个表中的匹配条件?,sql,multiple-tables,Sql,Multiple Tables,我非常感谢您对跨表SQL查询的帮助。我意识到这类问题经常被问到,但我找不到一个足够类似的问题来解释答案 我想从表A中选择在表B中具有相应标记的行 因此,例如,“从table_a中选择标记为“chair”的行”将返回table_C 另外,id在表a中是唯一的,而不是在表b中 table_A: table_B: table_C: id object id tag id obj
表A
中选择在表B
中具有相应标记的行因此,例如,“从
table_a
中选择标记为“chair”的行”将返回table_C
另外,id
在表a
中是唯一的,而不是在表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
或者,是否有更好的方法来组织数据?最简单的解决方案是相关的子选择: 或者,您可以加入表并筛选所需的行:
select
A.*
from
table_A A
inner join table_B B
on A.id = B.id
where
B.tag = 'chair'
您应该分析这两个标签,并查看数据集上哪一个更快。您应该使用链接表将标签设置为自己的表
select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = 'chair';
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
我有一个相似的问题(至少我认为是相似的)。在其中一份答复中,解决方案如下:
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>
更详细的信息:
表A列出了一组设备的状态信息。每个状态记录都带有该状态的开始和停止时间。表B定期记录设备的时间戳数据,我想在表A所示期间提取这些数据。@rjschnorenberg的建议是,如果您有机会更改模式,则更好。在这种情况下,您可以使用两个内部连接子句连接三个表ItemsItem_TagsTags。太好了,这非常有用。我不知道您可以像这样从联接表中筛选列。实际上,您也可以将联接行写为“A.ID=B.ID和B.tag='chair'”的内部联接表,但我更喜欢将筛选器放在何处。以下哪一项是“更好的”实践和性能方面的建议?或者完全是偏好?假设您可以控制模式,这是更好的答案。如果没有,请考虑创建一个视图,该视图将两个对象表结合起来,这样您就可以按照这个答案做了。
WHERE B.tag = A.<col_name>
WHERE B.val BETWEEN A.val1 AND A.val2