【问题标题】:PostgreSQL: What's the best way to find rows by two column values?PostgreSQL:通过两列值查找行的最佳方法是什么?
【发布时间】:2022-01-18 23:40:15
【问题描述】:

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

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;

返回我期望的结果。

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

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

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

【问题讨论】:

    标签: sql postgresql jpa jpql


    【解决方案1】:

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

    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'));
    

    【讨论】:

    • 谢谢!我完全忘记了这一点。不幸的是,我似乎无法将其翻译成 JPA。尽管如此,我相信这是数百行最简单的查询。
    【解决方案2】:

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

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

    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'
    

    【讨论】:

    • 我可能会误解,但“和”比“或”结合得更紧密,所以隐含的括号是:(my_package.name = 'a' AND my_version.version = '2.0.0') OR (my_package.name = 'b' AND my_version.version = '1.0.0')。您可以在 postgres 中使用 select true and false or true and false => false 进行测试
    • 谢谢!虽然我可能无法直接使用 JPQL 进行翻译,但我可能能够使用规范/标准 API 使其最终工作。指向正确方向的好主意。最后,我将有 100 条 OR 语句。
    猜你喜欢
    • 1970-01-01
    • 2011-08-18
    • 2016-01-08
    • 1970-01-01
    • 2011-07-10
    • 2018-08-11
    • 1970-01-01
    • 2015-05-10
    • 2013-03-17
    相关资源
    最近更新 更多