Sql 组合WHERE子句子查询

Sql 组合WHERE子句子查询,sql,Sql,SQL新手,设置select语句有困难 我有以下两个表,我正在尝试查询所有具有宽度的数据以及与相同观察id对应的上下文数据。我当前的查询生成所示的查询表 当前查询代码 SELECT value, trait_name, observation_id FROM measurements AS m INNER JOIN traits AS t ON m.trait_id = t.trait_id WHERE trait_name = 'width' OR trait_class = 'context

SQL新手,设置select语句有困难

我有以下两个表,我正在尝试查询所有具有宽度的数据以及与相同观察id对应的上下文数据。我当前的查询生成所示的查询表

当前查询代码

SELECT value, trait_name, observation_id
FROM measurements AS m
INNER JOIN
traits AS t
ON m.trait_id = t.trait_id
WHERE trait_name = 'width' OR trait_class = 'contextual'
当上下文数据与我选择的trait名称具有相同的观察id时,我如何仅返回上下文数据?所需的输出是查询表中以绿色显示的行


子查询将选择所有具有“温度”和“宽度”的
observation\u id
我理解您的问题的方式是,您只想显示trait\u name='width'的观察值,但同时显示trait\u name='width'或trait\u class='context'的观察值。获取观察结果的子查询是

SELECT observation_id 
FROM measurements m
INNER JOIN traits t
ON m.trait_id=t.trait_id
AND t.trait_name='width'
然后完整的查询将如下所示

SELECT value, trait_name, observation_id
FROM measurements AS m
INNER JOIN
traits AS t
ON m.trait_id = t.trait_id
WHERE (trait_name = 'width' OR trait_class = 'contextual')
AND observation_id IN
    (SELECT observation_id 
    FROM measurements m
    INNER JOIN traits t
    ON m.trait_id=t.trait_id
    AND t.trait_name='width')

我没有看到“从初始where子句中观察到”?@Luuk,只是我删除的一些psedoo查询,因为它混淆了问题。希望,现在更清楚了。你的意思是你只想显示具有相同观察id的“宽度”和“温度”的记录。上面的查询代码在图像中生成查询表。我只想要绿色的行,而不是因为我的OR语句而包含的黄色行。这只是我的数据库的一个简单示例,它有许多与trait_类组织或上下文相关的特性。我将查询这些特征,并希望收集所有上下文特征,这些特征具有与我的WHERE trait_name='x'返回的相同的观察值,而不是m2.trait_name='temperature',我将其替换为m2.trait_class='context'。这是否能捕捉到所有相关的特征?我上面的例子只有温度,但我的db还有很多其他的。只要你对结果满意,你可以改变任何事情。。。。我得到:错误代码:1054。where子句中的未知列m1.U名称。最好的猜测是,因为trait_名称不在度量表中,而是在traits表中。有没有办法让它更有效?如果没有子查询,我的查询将在0.141秒内执行。对于子查询,它的执行时间为61.844秒。当我将trait_名称更改为没有相应上下文数据的trait时,即子查询只返回几个观察ID,它将在0.375中执行sec@Patrick,在哪个SQL版本上运行这些查询,每个表中的记录数是多少?我猜一些索引可能会有所帮助。您可以在两个表上尝试trait_id索引,在traits表中尝试trait_name索引。
SELECT value, trait_name, observation_id
FROM measurements AS m
INNER JOIN
traits AS t
ON m.trait_id = t.trait_id
WHERE (trait_name = 'width' OR trait_class = 'contextual')
AND observation_id IN
    (SELECT observation_id 
    FROM measurements m
    INNER JOIN traits t
    ON m.trait_id=t.trait_id
    AND t.trait_name='width')