我需要选择表格的 a 信息以及一系列特定数字,即每个 a.id 我想要显示范围内的每个数字, 使用PostgreSQL 8.4 。
我们假设范围是数字123,175和192,这将是我想要的结果:
范围 a.id
123 1
175 1
192 1
123 2
175 2
192 2
123 3
175 3
192 3
我知道我可以使用
实现这一目标select range, a.id
from a
inner join generate_series(1, 100, 1) range on true
但问题是,我不想使用generate_series
,因为我的范围是随机数,还有其他方法吗?
也许是这样的:
select range, a.id
from a
where range in (123, 175, 192)
group by range, a.id;
答案 0 :(得分:3)
鉴于你的意见:
对于每个a.id,我想显示范围的每个数字
这会创建所谓的cartesian product
。这是使用cross join
union all
:
select a.id, r.rng
from a cross join (
select 123 as rng
union all select 234
union all select 556
union all select 653
union all select 634) r
答案 1 :(得分:2)
我知道你想要一个可以轻松使用多个数字列表作为参数的查询。使用数组:
with a(id) as (values (1), (2), (3))
select rng, id
from unnest(array[123, 175, 192]) rng
cross join a;
rng | id
-----+----
123 | 1
175 | 1
192 | 1
123 | 2
175 | 2
192 | 2
123 | 3
175 | 3
192 | 3
(9 rows)
答案 2 :(得分:1)
@sgeddes和@klin答案做出了很多贡献,尽管我已经接受了答案,但我正在写这篇文章来描述我发现工作并且“优雅”的3种解决方案。可悲的是,我不知道哪个表现更好。
// This is the one I'm using
select unnest(array[123, 175, 192]), a.id
from a
group by range, a.id
select range, a.id
from a
inner join (values (123), (175), (192)) data(range) on true
group by range, a.id
select range, a.id
from a
inner join unnest(array[123, 175, 192]) range on true
group by range, a.id