PostgreSQL:按两列值查找行的最佳方法是什么?

PostgreSQL: What's the best way to find rows by two column values?

假设我有软件包并且这些软件包有版本。每个版本都有自己的许可证。

create table my_package (
    id serial primary key,
    name text
);

insert into my_package (name) values
    ('a'),
    ('b'),
    ('c'),
    ('d');

create table my_version (
    my_package_id int references my_package,
    version text,
    license text
);

insert into my_version (my_package_id, version, license) values
    (1, '1.0.0', 'mit'),
    (1, '2.0.0', 'isc'),
    (1, '3.0.0', 'bsd'),
    (2, '1.0.0', 'foo'),
    (2, '2.0.0', 'bar'),
    (2, '3.0.0', 'baz'),
    (3, '1.0.0', 'aaa'),
    (3, '2.0.0', 'bbb'),
    (3, '3.0.0', 'ccc'),
    (4, '1.0.0', 'ggg'),
    (4, '2.0.0', 'qqq');

我的问题是找到我有版本和名称的包的许可证,例如a: 2.0.0b: 1.0.0.

这是我目前正在做的事情。

select
    my_package.name,
    my_version.version,
    my_version.license
from
    unnest(ARRAY['a', 'b'], array['2.0.0', '1.0.0']) as t(name, version)
join my_package on t.name = my_package.name
join my_version on my_package.id = my_version.my_package_id and t.version = my_version.version;

returns 我期待的结果。

|name|version|license|
|----|-------|-------|
|a   |2.0.0  |isc    |
|b   |1.0.0  |foo    |

我想知道是否有更简单的方法而不使用 unnest 并且最好在 from 子句中使用子查询。我的目标是找到一个使用 JPA 的查询。

有什么想法吗?非常感谢!

My problem is finding the licenses for packages where I have the versions and the names, e.g. a: 2.0.0 and b: 1.0.0.

我想知道您为什么不直接在 where 子句中查询这些值并写下此回复...并且只是注意到对 JPA 的引用,这是一个我不熟悉的包.在那种情况下,也许这没有帮助,但无论如何我都会 post 它。

select
    my_package.name,
    my_version.version,
    my_version.license
FROM my_package
INNNER JOIN my_version on my_package.id = my_version.my_package_id

WHERE my_package.name = 'a' AND my_version.version = '2.0.0' 
  OR my_package.name = 'b' AND my_version.version = '1.0.0'

您可以将一组列括在括号中来一起查询:

select
    my_package.name,
    my_version.version,
    my_version.license
from my_package p
 join my_version v on p.id = v.my_package_id 
WHERE
 (p.name,v.version) in (('a','2.0.0'),('b','1.0.0'));