在 table 中添加缺失的行

Add missing rows within a table

我需要一个提示,在我的 table 中,订单的位置可能不会写入下一个 ID。

让我们看看 table:

ID 3 中缺少位置 2

ID DOC POSI TOTAL
1 123 1 100
1 123 2 600
1 123 3 200
2 123 1 100
2 123 2 600
2 123 3 200
3 123 1 100
3 123 3 200

是否可以使用 SQL 创建一个视图,将各个 ID 分区相互比较,并将 ID 2 到 ID 3 的缺失值作为一行追加?

如果可能的话,也许你有一些关键字给我。

提示是:使用连接。

解决此问题的一种方法是,您 select 您期望的密钥对然后离开加入原始 table。请注意 missing-value 处理,因为您没有在问题中指定这些新创建的条目应该发生什么。

测试数据

CREATE TABLE test (id INTEGER, doc INTEGER, posi INTEGER, total INTEGER);
INSERT INTO test VALUES (1, 123, 1, 100);
INSERT INTO test VALUES (1, 123, 2, 600);
INSERT INTO test VALUES (1, 123, 3, 200);
INSERT INTO test VALUES (2, 123, 1, 100);
INSERT INTO test VALUES (2, 123, 2, 600);
INSERT INTO test VALUES (2, 123, 3, 200);
INSERT INTO test VALUES (3, 123, 1, 100);
INSERT INTO test VALUES (3, 123, 3, 200);

可以使用交叉连接生成可能的组合键:

SELECT DISTINCT a.id, b.posi 
FROM test a, test b

现在加入原来的table:

WITH expected_lines AS (
    SELECT DISTINCT a.id, b.posi 
    FROM test a, test b
)
SELECT el.id, el.posi, t.doc, t.total
FROM expected_lines el
LEFT JOIN test t ON el.id = t.id AND el.posi = t.posi

您没有进一步描述现在空的列应该发生什么。您可能会注意到 DOCTOTALnull.

我有根据的猜测是,您想将 DOC 作为密钥的一部分并假设 TOTAL0。如果是这样,您可以执行以下操作:

WITH expected_lines AS (
    SELECT DISTINCT a.id, b.posi, c.doc 
    FROM test a, test b, test c
)
SELECT el.id, el.posi, el.doc, ifnull(t.total, 0) total
FROM expected_lines el
LEFT JOIN test t ON el.id = t.id AND el.posi = t.posi AND el.doc = t.doc

结果