Postgres - Lateral join with random values on both sides Postgres - Lateral join with random values on both sides postgresql postgresql

Postgres - Lateral join with random values on both sides


Your problem is that you are assigning the person uuid in the outermost select. So, you get one for each row.

My first thought is a bit more complicated:

with p as (      select gen_random_uuid() as person, g.i      from generate_series(1, 2) g(i)     ),     u as (      select gen_random_uuid() as utility, g.i      from generate_series(1, 6) g(i)    )select p.person, u.utilityfrom p join     u     on mod(p.i, 2) = mod(u.i, 2);

Admittedly, a lateral join is simpler, but a similar idea can be used:

with p as (      select gen_random_uuid() as person, g.i      from generate_series(1, 2) g(i)     )select p.person, u.utilityfrom p, lateral     (select gen_random_uuid() as utility      from generate_series(1, 3)     ) u;

Or, without a lateral join at all:

with p as (      select gen_random_uuid() as person, g.i      from generate_series(1, 2) g(i)     )select p.person, gen_random_uuid() as utilityfrom p cross join     generate_series(1, 3);


Here is example (I use md5 instead of gen_random_uuid, but same idea):

t=# with  person as (select md5(random()::text) from generate_series(1,2,1)), utility  as (select md5(random()::text) from generate_series(1,3,1))select  person.md5, utility.md5from personjoin utility on true;               md5                |               md5----------------------------------+---------------------------------- 74df2447c58a1595e0a8458d1142e2e0 | 3703e2004a1494e6dd74cd51f4dd029e 74df2447c58a1595e0a8458d1142e2e0 | a1f7d74adc1ff3a49533204071e00f82 74df2447c58a1595e0a8458d1142e2e0 | 4f32029c29eee254d9c97045d06bcdf5 48a56953721f04752b325c332e26a5ed | 3703e2004a1494e6dd74cd51f4dd029e 48a56953721f04752b325c332e26a5ed | a1f7d74adc1ff3a49533204071e00f82 48a56953721f04752b325c332e26a5ed | 4f32029c29eee254d9c97045d06bcdf5(6 rows)

I made it based on

I need 2 random persons with each 3 random utlities

not on previous statements


select *from    (        select gen_random_uuid() as person        from generate_series(1,2)    ) p    inner join lateral    (        select gen_random_uuid() as utility, p.person        from generate_series(1,3)    ) u using (person);                person                |               utility                --------------------------------------+-------------------------------------- d8655c1d-5051-4f5c-929e-efb92a2e6a93 | 1524b662-f2a3-4bfa-bc47-71b96a8e6121 d8655c1d-5051-4f5c-929e-efb92a2e6a93 | e38190f4-bf36-49f9-92c0-11fa18113aad d8655c1d-5051-4f5c-929e-efb92a2e6a93 | 799a9e39-f954-4d35-8b9a-1fe444d91ccf 3f581430-75be-4c07-aff1-e1c2c802b463 | 3261f4f9-4c28-4709-9b38-cf3ce287317e 3f581430-75be-4c07-aff1-e1c2c802b463 | f9bbadaf-7c68-48f2-bb9b-d57e2902e3f1 3f581430-75be-4c07-aff1-e1c2c802b463 | 158b8e0d-5b22-4f4d-8052-589aaa224b2e