SQLITE3:当有数百列要转换时,将ID转换为代码
我有一个表a,它有几百列(比如301),第一列是主键,其余的是表B的ID,即SQLITE3:当有数百列要转换时,将ID转换为代码,sql,sqlite,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
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列
有人能帮我解决这个问题吗?我同意@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;
我同意@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;
300多列?通过将这些列旋转成行来重做
表A
怎么样。您可以有键名和键值列。例如:
select * from A:
id, ko_name, ko_value
1, ko1, 5
1, ko2, 6
然后选择键就变得容易多了;e、 g:
SELECT name FROM B WHERE id in (SELECT ko_value FROM A where ko_name in ('ko1', 'ko2')) ;
300多列?通过将这些列旋转成行来重做
表A
怎么样。您可以有键名和键值列。例如:
select * from A:
id, ko_name, ko_value
1, ko1, 5
1, ko2, 6
然后选择键就变得容易多了;e、 g:
SELECT name FROM B WHERE id in (SELECT ko_value FROM A where ko_name in ('ko1', 'ko2')) ;
您的数据结构很糟糕,因此需要将代码复制300次,每列复制一次。如果您使用连接/关联表,那么这将很容易。请使用您选择的编程语言编写一个for循环,从
ko1
打印到ko301
,中间带逗号,并复制和粘贴此输出。@stickybit感谢您的建议,但如果可能,我希望避免这种情况。另外,我认为一个语句可以容纳的字符数量是有限制的。谢谢@GordonLinoff的建议,我认为你是对的,但我认为没有一个像样的结构。你能推荐一个吗?即使只是很粗糙,我也在正确的轨道上。三列如何:pk、key name和key value。您的数据结构很糟糕,因此需要复制代码300次,每列一次。如果您使用连接/关联表,那么这将很容易。请使用您选择的编程语言编写一个for循环,从ko1
打印到ko301
,中间带逗号,并复制和粘贴此输出。@stickybit感谢您的建议,但如果可能,我希望避免这种情况。另外,我认为一个语句可以容纳的字符数量是有限制的。谢谢@GordonLinoff的建议,我认为你是对的,但我认为没有一个像样的结构。你能推荐一个吗?即使它只是粗略的,所以我在正确的轨道上。三列如何:pk、key name和key value。这是有意义的,但它的伸缩性如何?例如,如果我的原始表有10000行呢?您的表现在将有300*10000=3000000行。如果原始表有1000000行呢?我将通过id和ko_值进行查询。它可以很好地扩展,但这需要另一个问题的空间。也就是说,Sqlite3实际上可以通过这种简单的键/值表超越其他数据库引擎?例如,如果我的原始表有10000行呢?您的表现在将有300*10000=3000000行。如果原始表有1000000行呢?我将通过id和ko_值进行查询。它可以很好地扩展,但这需要另一个问题的空间。也就是说,Sqlite3实际上可以通过这种简单的键/值表超越其他数据库引擎。