Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从一个表中选择另一个表中的匹配条件?_Sql_Multiple Tables - Fatal编程技术网

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

我非常感谢您对跨表SQL查询的帮助。我意识到这类问题经常被问到,但我找不到一个足够类似的问题来解释答案

我想从
表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