我有两个表(显示了前两个),并且需要从前两个表中减去第三个-我需要进行联接还是可以引用不联接的表?
所示的第三张表是所需的输出。谢谢你的帮助!
| ACC | CALL DATE | | |
+-----+-----------+--+--+
| 1 1 | 2/1/18 | | |
+-----+-----------+--
+-----+---------------+--+--+
| ACC | PURCHASE DATE | | |
+-----+---------------+--+--+
| 1 1 | 1/1/18 | | |
+-----+---------------+--+--+
+-----+-----------+----------------------+--+
| ACC | CALL DATE | PRIOR MONTH PURCHASE | |
+-----+-----------+----------------------+--+
| 1 1 | 2/1/18 | YES | |
+-----+-----------+----------------------+--+
答案 0 :(得分:1)
让我们检查选项
说,如果要根据前两个表中的数据创建一个新的第三个表,那么对其中一个表的每个更新/插入/删除也都应传播到第三个表中。
假设您有一个视图,它可以满足您的需要,不需要维护该第三张表,也不需要在每次查询时从前两个表中获取所需的数据。
create view third_table as
select a.acc,a.call_date,case when dateadd(mm,-1,a.call_date)=b.purchase_date then 'Yes' else 'No end as prior_month_purchase
from first_table a
left join second_table b
on a.acc=b.acc
答案 1 :(得分:1)
当然,您可以有一个查询,该查询引用多个表而无需联接。 union all
是执行此操作的运算符的示例。
还有一个问题是您在问题中“加入”的意思。如果您是说 explicit 联接,那么有一些解决方法-例如相关的子查询。但是,它们正在数据库引擎中实现某种形式的“联接”。
对于您的查询,您希望将exists
与相关的子查询一起使用:
select t1.*,
(case when exists (select 1
from table2 t2
where t2.acc = t1.acc and
datediff(month, t2.purchase_date, t1.call_date) = 1
)
then 'Yes' else 'No'
end) as prior_month_purchase
from table1 t1;
这比join
“更好”,因为它不会增加或删除行。结果集具有第一个表中的确切行,并带有附加列。
该语法假定使用SQL Server(这是原始标记)。尽管众所周知,日期函数依赖于数据库,但在其他数据库中也可以表达类似的逻辑。