Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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_Postgresql - Fatal编程技术网

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)