SQL视图中的联合联接

SQL视图中的联合联接,sql,stored-procedures,union,sql-view,Sql,Stored Procedures,Union,Sql View,我遇到的情况是,SQl表(a)包含以下格式的数据: MODEL ID | PERIOD ID | VERSION | RESOURCEDRIVER | VALUE Period字段包含APRIl、MAY、JUNE等,但也包含一个名为“PERIODS”的值,该值在数据库中用于表示该行适用于所有其他时段APRIl、MAY、JUNE 我正在尝试将该表链接到另一个没有此设置的表,即“PERIODS”不存在。因此,我需要为“句点”表示的每个组合创建一个文本条目 为此,我创建了一个SQL视图(B),其中列

我遇到的情况是,SQl表(a)包含以下格式的数据:

MODEL ID | PERIOD ID | VERSION | RESOURCEDRIVER | VALUE
Period字段包含APRIl、MAY、JUNE等,但也包含一个名为“PERIODS”的值,该值在数据库中用于表示该行适用于所有其他时段APRIl、MAY、JUNE

我正在尝试将该表链接到另一个没有此设置的表,即“PERIODS”不存在。因此,我需要为“句点”表示的每个组合创建一个文本条目

为此,我创建了一个SQL视图(B),其中列出:

MODEL ID| PERIOD ID | PERIOD NAME
此表已被筛选,以便排除“期间”值和/或任何其他非期望值

然后,我设置了第三个视图(C),该视图为PERIOD=“PERIODS”过滤表a中的数据,并在模型ID上创建了表a和视图B之间的联接,以便为出现值“PERIODS”的每一行创建多个替换它的行。这对这些行很好,但我现在需要将结果集与原始表A合并,其中是文字值,即APRIL、MAY、JUNE

在一个查询中,我可以做得很好,因为我选择每个临时表,在两个临时表之间执行
联合
查询,输出结果并删除临时表

这里的问题是,这只是SQL视图链的第一部分,因此我需要将结果传递给下一个查询。(因此,我认为也许一个存储过程可以起作用)

然而,我担心的是,这些数据可能会被多个用户同时请求,因此不能让它们都触发临时表创建,因为它们会覆盖彼此的数据

谁能告诉我在SQL视图中实现联合数据集的最佳方法是什么


谢谢你

我觉得问题的症结在于:OP没有提出真正的问题,而是要求修复他迄今为止所做的事情

SELECT model_id, period_id, version, resourcedriver, value, NULL AS period_name FROM table_1
UNION ALL
SELECT model_id, period_id, NULL AS version, NULL as resourcedriver, NULL as value, period_name FROM table_2

这个问题非常类似于常见的“我希望
NULL
在查询中充当通配符”后者的解决方案:
JOIN
on equality或
NULL

a.Key = b.Key OR a.Key IS NULL
第一个条件将检查共享值,第二个条件告诉DB,如果
a.Key
中的值为
NULL
,则
b.Key
中的值无关紧要

唯一的区别是,通配符是一个特定值,而不是
NULL
,因此条件从
为NULL
更改为
=通配符

a.Key = b.Key OR a.Key = 'wildcard'
查询是在不了解OP系统的情况下进行的,在问题中只描述了基表,模型可以很容易地调整(或者如果OP添加信息并询问,我可以编辑它)


演示使用的是T-SQL,但查询仅使用标准运算符。

您是否尝试过使用关键字union连接两个查询?!!我确信我已经(尽管已经全部使用了UNION)。。。但我刚刚又做了一次,实际上它正在工作。。。抱歉浪费时间,谢谢您的回复。@serpiton这句where语句如何匹配“四月”和“期间”?-当然,OR子句只是将表A中的值“PERIODS”与表BI中的值“PERIODS”相匹配,我最近回答了一个问题。我的解决方案的一部分包括做你似乎想做的事情。嗨,谢谢,是的,这是答案,正如瓦克罗诺斯在上面指出的,一旦我建立了联盟,我会接受它。这是做联盟的最好方式。也就是说,如果你能将时间段与4月份相匹配,那将比处理一系列查询要好得多。
SELECT a.Model_ID, a.Period_ID PeriodA, b.Period_ID PeriodB
FROM   TableA a
       INNER JOIN TableB b ON a.Model_ID = b.Model_ID
                          AND (a.Period_ID = b.Period_ID 
                            OR a.Period_ID = 'PERIODS')