sql根据多个标准检查联接表是否有行
我有两个表,资产和资产参数 资产sql根据多个标准检查联接表是否有行,sql,postgresql,Sql,Postgresql,我有两个表,资产和资产参数 资产 |asset_id| some_asset_data | ----------------------------- | 1 | 'some data' | | 2 | 'some other data'| 资产参数 |asset_param_id|asset_id|param_name|param_value| ------------------------------------------------ |
|asset_id| some_asset_data |
-----------------------------
| 1 | 'some data' |
| 2 | 'some other data'|
资产参数
|asset_param_id|asset_id|param_name|param_value|
------------------------------------------------
| 1 | 1 | 'Memory' | '4096' |
| 2 | 1 | 'OS' | 'Windows' |
| 3 | 2 | 'Memory' | '4096' |
| 4 | 2 | 'OS' | 'Linux' |
现在,我如何才能找到具有参数的资产,其中有一个名为“Memory”的参数,其值为“4096”,还有一个名为“OS”的参数,其值为“Windows”
期望的结果是在示例中找到一个id为1的资产行
我找不到合理的解决办法。非常感谢您的帮助。您可以通过聚合和
have
子句来实现这一点:
select asset_id
from asset_params
where param_name = 'Memory' and param_value = '3096' or
param_name = 'OS' and param_value = 'Windows'
group by asset_id
having count(*) = 2;
注意:如果可以有多个同名参数,则应使用count(不同的参数名称)
=2
这很容易推广。一种更像博士后的写作方式是:
select asset_id
from asset_params
where (param_name, param_value) in (('Memory', '3096'), ('OS', 'Windows'))
group by asset_id
having count(*) = 2;
您可以通过聚合和
having
子句来实现这一点:
select asset_id
from asset_params
where param_name = 'Memory' and param_value = '3096' or
param_name = 'OS' and param_value = 'Windows'
group by asset_id
having count(*) = 2;
注意:如果可以有多个同名参数,则应使用count(不同的参数名称)
=2
这很容易推广。一种更像博士后的写作方式是:
select asset_id
from asset_params
where (param_name, param_value) in (('Memory', '3096'), ('OS', 'Windows'))
group by asset_id
having count(*) = 2;
像这样的方法应该会奏效:
select * from assets where
assets_id in (select assets_id from asset_params
where name = "OS" and value = "Win")
and
assets_id in (select assets_id from asset_params
where name = "memory" and value = "4096")
如果表很大,则需要适当的索引。但无论如何,你都应该有好的索引 像这样的方法应该会奏效:
select * from assets where
assets_id in (select assets_id from asset_params
where name = "OS" and value = "Win")
and
assets_id in (select assets_id from asset_params
where name = "memory" and value = "4096")
如果表很大,则需要适当的索引。但无论如何,你都应该有好的索引 如果您的资产有两倍于参数“Memory”的值“3096”,而不是参数“OS”的值“Windows”,会发生什么情况?我认为在这种情况下,您的计数将为2,但结果不是预期的结果。我认为您应该在第一个查询的
WHERE
部分使用显式大括号,使其看起来像WHERE(…)或(…)
@CédricL.Charlier。检查“注意事项”。如果OP可以有多个同名参数,则使用count(distinct)
。如果资产的参数“Memory”的值是“3096”的两倍,而不是参数“OS”的值是“Windows”,会发生什么情况?我认为在这种情况下,您的计数将为2,但结果不是预期的结果。我认为您应该在第一个查询的WHERE
部分使用显式大括号,使其看起来像WHERE(…)或(…)
@CédricL.Charlier。检查“注意事项”。如果OP可以有多个同名参数,则使用count(distinct)
。