0

链接: https : //www.2ndquadrant.com/wp-content/uploads/2019/05/sumtest.sql_.txt https://www.2ndquadrant.com/en/blog/join-lateral/

CREATE TABLE co_books (
    dd  numeric references books(dd),
    pname text references persons(pname),
    checked_out timestamptz,
    checked_in timestamptz);
Do $$
    DECLARE
    i int;
    afew int;
    p record;
    BEGIN
        FOR p IN SELECT pname FROM persons LOOP
            afew := (random() * 10)::integer;
            FOR i in 0..afew LOOP
                INSERT INTO co_books (dd, pname, checked_out) 
                VALUES 
                    ( (SELECT dd FROM books ORDER BY random() LIMIT 1), 
                         p.pname, /* hint: fix bad random data here */
                         (SELECT xtime FROM X2018 ORDER BY random() LIMIT 1)
                    );

            END LOOP;
        END LOOP;
    RETURN;
END;
$$;

如果您点击链接,您可以清楚地看到 table person 列 pname 有 24 个唯一行。在我执行完代码块之后,然后测试 table: co_books 中有多少行。第一次是 129 行,然后我删除 co_books,再次执行代码,行是 156 行,第三次是 154 行。所以在这种情况下,我想我不明白以下部分。

FOR p IN SELECT pname FROM persons LOOP
            afew := (random() * 10)::integer;
            FOR i in 0..afew LOOP
4

1 回答 1

0

random()返回一个介于 0 和 1 之间的随机双精度数。

(random() * 10)::integer

是 0 到 10 之间的随机整数。

INSERT所以循环将在 1 到 11条语句之间执行co_books

因此可以预料,每次运行代码时,表中的行数都会发生变化。

于 2020-11-03T13:25:45.383 回答