SQLite 替代转置/sub-select returns N 列 - 预期 1

SQLite alternative to transposition / sub-select returns N columns - expected 1

我在主要 ID 之间有一个 table 关系,我试图用它来获取它们的伴随属性列表。下面的最小示例将抛出 Error: sub-select returns 3 columns - expected 1。我在这里阅读了一些人们在进行换位时使用的解决方案,但他们似乎要么依赖于仅在一列中使用一小组选择来查找数据,要么依赖于类似的替代用例。考虑到尺寸和属性之间缺乏分组,我认为这不适合我的实际数据集,但也许有一个我没有看到的简单替代查询。或者也许是一种更好的方式来构建数据以适应这样的查询。

CREATE TABLE Keys(primary_id, id1, id2);
CREATE TABLE Attr(id, attr1, attr2);

INSERT INTO Keys VALUES(1, 2, 3);
INSERT INTO Keys VALUES(2, 4, 5);
INSERT INTO Keys VALUES(3, 6, 7);
INSERT INTO Attr VALUES(1, "a", "b");
INSERT INTO Attr VALUES(2, "c", "d");
INSERT INTO Attr VALUES(3, "e", "f");
INSERT INTO Attr VALUES(4, "g", "h");
INSERT INTO Attr VALUES(5, "i", "j");
INSERT INTO Attr VALUES(6, "k", "l");
INSERT INTO Attr VALUES(7, "m", "n");

SELECT *
FROM Attr
WHERE Attr.id IN (SELECT * from Keys where Keys.primary_id=2)

期望的输出:

| 2 | "c" | "d" |
| 4 | "g" | "h" |
| 5 | "i" | "j" |

如果以某种我可以解析的方式对所有非主键进行分组是有意义的,我可以更改键 table。我放下钥匙并尝试了类似的东西:

CREATE TABLE Keys(primary_id, ids);
INSERT INTO Keys VALUES(1, json_array('[2, 3]'));
INSERT INTO keys VALUES(2, json_array('[4, 5]'));
INSERT INTO Keys VALUES(3, json_array('[6, 7]'));

这个查询 SELECT json_extract(ids, '$[#-1]') FROM Keys WHERE Keys.primary_id=2; returns [4,5] 但是,

SELECT *
FROM Attr
WHERE Attr.id IN (SELECT json_extract(ids, '$[#-1]') FROM Keys WHERE Keys.primary_id=2)

returns 空。如果无论如何都不能从数组中 select ,那可能甚至不是一种有效的方法。感谢大家的集体智慧!

编辑: 完整性解决方案:

SELECT *
FROM Attr
WHERE Attr.id IN (SELECT primary_id FROM Keys WHERE Keys.primary_id=2
                  UNION
                  SELECT id1 FROM Keys WHERE Keys.primary_id=2
                  UNION
                  SELECT id2 FROM Keys WHERE Keys.primary_id=2);

使用这种方法,我的实际用例的子查询超过 100 行,但执行速度仍然很快。我猜查询优化器缓存了每个 SELECT 语句,因此它实际上并不是每次都在该匹配项上重新查询。

在您的子查询中,您需要单独 select 每个 id 列并将结果合并在一起,即您的子查询将有 3 个 select 联合语句