【问题标题】:Sqlite3: display value of multiple foreign keysSqlite3:显示多个外键的值
【发布时间】:2018-02-06 17:08:14
【问题描述】:

我有以下 Sqlite 数据库:

BEGIN TRANSACTION;
CREATE TABLE "main" (
    `id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    `fk_1`  INTEGER NOT NULL,
    `fk_2`  INTEGER NOT NULL,
    FOREIGN KEY(`fk_1`) REFERENCES `foreign_table`(`id`) ON DELETE SET NULL,
    FOREIGN KEY(`fk_2`) REFERENCES `foreign_table`(`id`) ON DELETE SET NULL
);
INSERT INTO `main` VALUES (1,1,2);
INSERT INTO `main` VALUES (2,2,3);
INSERT INTO `main` VALUES (3,1,4);
INSERT INTO `main` VALUES (4,2,4);
INSERT INTO `main` VALUES (5,2,3);
CREATE TABLE "foreign_table" (
    `id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    `val`   TEXT NOT NULL UNIQUE
);
INSERT INTO `foreign_table` VALUES (1,'val1');
INSERT INTO `foreign_table` VALUES (2,'val2');
INSERT INTO `foreign_table` VALUES (3,'val3');
INSERT INTO `foreign_table` VALUES (4,'val4');
CREATE VIEW bfk as select * from foreign_table;
CREATE VIEW afk as select * from foreign_table;
COMMIT;

如您所见,列main.fk_1main.fk_2 引用foreign_table 中的id 字段。我想显示foreign_table.val 的值而不是foreign_table.id。到目前为止,我已经提出了以下 SQL 语句:

-- uncomment if views have to be created first
-- create temporary view afk as select * from foreign_table;
-- create temporary view bfk as select * from foreign_table;
select main.id, afk.val, bfk.val from main
left outer join afk on main.fk_1=afk.id
left outer join bfk on main.fk_2=bfk.id
;

输出是:

id | val  | val
---+------+------
1  | val1 | val2
2  | val2 | val3
3  | val1 | val4
4  | val2 | val4
5  | val2 | val3

这几乎就是我想要的。我实际上想保留 main 表中的列名,因此输出应如下所示:

id | fk_1 | fk_2
---+------+------
1  | val1 | val2
2  | val2 | val3
3  | val1 | val4
4  | val2 | val4
5  | val2 | val3

这可以吗?我加入观点的方法是否合理,或者有更好的方法吗?

【问题讨论】:

    标签: sql sqlite foreign-keys


    【解决方案1】:

    经过一些进一步的研究,我找到了一种临时为已创建视图的列分配新名称的方法。创建视图时,可以为视图中的列分配自定义名称。我的解决方案现在看起来像这样:

    create temporary view if not exists afk (id,fk_1) as select id, val from foreign_table;
    create temporary view if not exists bfk (id,fk_2) as select * from foreign_table;
    select main.id, afk.fk_1, bfk.fk_2 from main
    left outer join afk on main.fk_1=afk.id
    left outer join bfk on main.fk_2=bfk.id
    ;
    

    这将产生所需的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-27
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 2017-02-14
      • 1970-01-01
      相关资源
      最近更新 更多