我有一个包含3列的表,该表在一个表中都包含许多数据流。
val_name
是数据流的名称,val_sequence
是递增的序列号,而val
包含数据。 name
和sequence
的组合就像一个复合索引。
此表中现有的val_name
流是a,b。我希望用户能够请求流c(不在表中),并且数据库可以动态返回a * b。
a * b就像将两个表相乘,一个表仅包含val_name
a,另一个val_name
b,然后在val_sequence
上联接(很像将索引的python相乘熊猫系列)。
结果将是:
val_sequence val_name val
0 c 80
1 c 5
这个想法是,用户应该能够请求a或b或c并接收数据,而无需知道a和b保留数据,而c仅保留引用。在中间或两端都可能缺少一些序列号。
我还没有办法找到一种提供这种灵活性的好方法。 SQL视图是否足够灵活?如果可以的话,您能举个简单的例子吗?如果没有,什么是可行的替代方案?您选择的任何数据库引擎都可以。
为方便起见,我提供了SQL代码,该代码创建一个表并插入上述值,并创建两个视图。这并不能满足我的需要,但是对于那些想尝试一下的人来说,这是一个开始。
CREATE TABLE IF NOT EXISTS valdb (
val_name VARCHAR(255),
val INT,
val_sequence int
);
INSERT into valdb (val_name, val, val_sequence) VALUES ("a",10,0);
INSERT into valdb (val_name, val, val_sequence) VALUES ("a", 1,1);
INSERT into valdb (val_name, val, val_sequence) VALUES ("b", 8,0);
INSERT into valdb (val_name, val, val_sequence) VALUES ("b", 5,1);
CREATE VIEW `a` AS SELECT val_name, val, val_sequence from valdb WHERE val_name = "a" ;
CREATE VIEW `b` AS SELECT val_name, val, val_sequence from valdb WHERE val_name = "b" ;
答案 0 :(得分:1)
如果如您的样本所示,保证两个流的序列号相同,即,并且仅当a
和 n <退出 n 时/ em>对于b
也存在,它是序列号和*
运算符的内部联接,用于获得乘法。
CREATE VIEW c
AS
SELECT 'c' val_name,
a.val_sequence,
a.val * b.val val
FROM a
INNER JOIN b
ON a.val_sequence = b.val_sequence;
db<>fiddle(假设您提供的代码的语法为MySQL)
如果假设不成立,则需要定义在失败的情况下应该发生的情况。例如。是否要获取下一个可用的序列号,以及a
或b
是否提供“前导”序列号,或者对于丢失的序列号,是否应该假设val
为0
,等。