在 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
您没有进一步描述现在空的列应该发生什么。您可能会注意到 DOC
和 TOTAL
是 null
.
我有根据的猜测是,您想将 DOC
作为密钥的一部分并假设 TOTAL
为 0
。如果是这样,您可以执行以下操作:
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
结果
我需要一个提示,在我的 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
您没有进一步描述现在空的列应该发生什么。您可能会注意到 DOC
和 TOTAL
是 null
.
我有根据的猜测是,您想将 DOC
作为密钥的一部分并假设 TOTAL
为 0
。如果是这样,您可以执行以下操作:
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
结果