Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLITE3:当有数百列要转换时,将ID转换为代码_Sql_Sqlite - Fatal编程技术网

SQLITE3:当有数百列要转换时,将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

我有一个表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列


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

我同意@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实际上可以通过这种简单的键/值表超越其他数据库引擎。