SQLITE3:当有数百列要转换时,将ID转换为代码

时间:2018-08-18 14:10:39

标签: sql sqlite

我有一个表A,其中有几百列(例如301),第一列是主键,其余是表B中的ID,即

CREATE TABLE "A" (
        ko_index_id INTEGER NOT NULL,
        ko1 INTEGER NOT NULL,
        ko2 INTEGER NOT NULL,
        ...
        ko300 INTEGER NOT NULL,
        PRIMARY KEY (ko_index_id)
);

CREATE TABLE "B" (
        id INTEGER NOT NULL,
        name INTEGER NOT NULL,
        PRIMARY KEY (id)
);

我希望能够将ID转换为名称。例如:

SELECT name FROM B WHERE id in (SELECT * FROM A);

除了SELECT *部分,这意味着ko_index_id将被馈送到B中,这是错误的。如果A中只有两列,我可以写

SELECT name FROM B WHERE id in (SELECT ko1, ko2 FROM A);

但是表A有300列!

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

我同意@Gordon的评论。如果您有能力更改数据模型,建议您使用一个交叉表。这是在数据库中建模“多对多”关系的典型方法。

示例:

CREATE TABLE "A" (
        id INTEGER NOT NULL,
        ...
        PRIMARY KEY (id)
);

CREATE TABLE "B" (
        id INTEGER NOT NULL,
        name INTEGER NOT NULL,
        ...
        PRIMARY KEY (id)
);

CREATE TABLE "AB" (
        a_id INTEGER NOT NULL,
        b_id INTEGER NOT NULL
);

SELECT A.id, B.name 
FROM A
INNER JOIN AB ON A.id=AB.a_id
INNER JOIN B ON AB.b_id=B.id;

答案 1 :(得分:2)

300列以上?通过将这些列旋转为行来重做table A怎么样。您可能有键名称和值列。例如:

select * from A: 
id, ko_name, ko_value
1,  ko1, 5
1,  ko2, 6 

然后选择键变得更加容易;例如:

SELECT name FROM B WHERE id in (SELECT ko_value FROM A where ko_name in ('ko1', 'ko2')) ;