0

我想根据外键依赖项按排序顺序从给定模式中检索表名。例如,如果我在 Snowflake 中创建了三个下表

CREATE TABLE TAB_X
(
    COL_A CHAR(18),
    COL_B CHAR(18),
    COL_C CHAR(18),
    CONSTRAINT XPKTAB_X PRIMARY KEY (COL_A, COL_B)
);

CREATE TABLE TAB_Z
(
    COL_D CHAR(18),
    COL_E CHAR(18),
    COL_F CHAR(18),
    COL_G CHAR(18),
    COL_A CHAR(18),
    COL_B CHAR(18),
    CONSTRAINT XPKTAB_Z PRIMARY KEY (COL_D, COL_E, COL_A, COL_B),
    CONSTRAINT R_1 FOREIGN KEY (COL_A, COL_B) REFERENCES TAB_X (COL_A, COL_B)
);

CREATE TABLE TAB_B
(
    COL_H CHAR(18),
    COL_I CHAR(18),
    COL_J CHAR(18),
    COL_K CHAR(18),
    COL_D CHAR(18),
    COL_E CHAR(18),
    COL_A CHAR(18),
    COL_B CHAR(18),
    CONSTRAINT XPKTAB_B PRIMARY KEY (COL_H, COL_I, COL_D, COL_E, COL_A, COL_B),
    CONSTRAINT R_2 FOREIGN KEY (COL_D, COL_E, COL_A, COL_B) REFERENCES TAB_Z (COL_D, COL_E, COL_A, COL_B)
);

在这种情况下,如果我执行一个SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES;查询,那么它会按字母顺序返回表名,那就是。

TAB_B
TAB_X
TAB_Z

但我想要正确的创作顺序,即:

TAB_X
TAB_Z
TAB_B

对此的任何帮助将不胜感激。

更新:我无法通过根据 CREATION 时间戳对表名进行排序来实现这一点,例如,如果我按如下方式创建表:

CREATE TABLE TAB_A
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_6 CHAR(18),
    COL_8 CHAR(18),
    COL_12 CHAR(18)
);

ALTER TABLE TAB_A
    ADD CONSTRAINT XPKCOL_C PRIMARY KEY (COL_1, COL_2, COL_3, COL_6, COL_8);

CREATE TABLE TAB_C
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_6 CHAR(18),
    COL_8 CHAR(18),
    COL_11 CHAR(18)
);

ALTER TABLE TAB_C
    ADD CONSTRAINT XPKCOL_X PRIMARY KEY (COL_1, COL_2, COL_3, COL_6, COL_8);

CREATE TABLE TAB_O
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_6 CHAR(18),
    COL_8 CHAR(18),
    COL_12 CHAR(18)
);

ALTER TABLE TAB_O
    ADD CONSTRAINT XPKCOL_A PRIMARY KEY (COL_1, COL_2, COL_3, COL_6, COL_8);

CREATE TABLE TAB_X
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_4 CHAR(18),
    COL_5 CHAR(18)
);

ALTER TABLE TAB_X
    ADD CONSTRAINT XPKTAB_A PRIMARY KEY (COL_1, COL_2, COL_3);

CREATE TABLE TAB_Z
(
    COL_1 CHAR(18),
    COL_2 CHAR(18),
    COL_3 CHAR(18),
    COL_6 CHAR(18),
    COL_8 CHAR(18),
    COL_9 CHAR(18),
    COL_0 CHAR(18)
);

ALTER TABLE TAB_Z
    ADD CONSTRAINT XPKTAB_Z PRIMARY KEY (COL_1, COL_2, COL_3, COL_6, COL_8);

ALTER TABLE TAB_A
    ADD CONSTRAINT R_4 FOREIGN KEY (COL_1, COL_2, COL_3, COL_6, COL_8) REFERENCES TAB_C (COL_1, COL_2, COL_3, COL_6, COL_8);

ALTER TABLE TAB_C
    ADD CONSTRAINT R_2 FOREIGN KEY (COL_1, COL_2, COL_3, COL_6, COL_8) REFERENCES TAB_Z (COL_1, COL_2, COL_3, COL_6, COL_8);

ALTER TABLE TAB_O
    ADD CONSTRAINT R_3 FOREIGN KEY (COL_1, COL_2, COL_3, COL_6, COL_8) REFERENCES TAB_C (COL_1, COL_2, COL_3, COL_6, COL_8);

ALTER TABLE TAB_Z
    ADD CONSTRAINT R_1 FOREIGN KEY (COL_1, COL_2, COL_3) REFERENCES TAB_X (COL_1, COL_2, COL_3);
4

2 回答 2

0

INFORMATION_SCHEMA.TABLES 视图有一个 CREATED 时间戳。您可以按时间戳排序返回它们:

select TABLE_NAME from INFORMATION_SCHEMA.TABLES order by CREATED;

如果您正在寻找其他东西,请告诉我。谢谢。

于 2020-04-02T16:41:19.680 回答
0

将其与 information_schema.table_constraints 连接并过滤和排序键类型以获取信息。

于 2020-04-02T16:56:25.557 回答