引用第二张表的新列-我需要联接吗?

时间:2018-11-18 04:34:11

标签: sql

我有两个表(显示了前两个),并且需要从前两个表中减去第三个-我需要进行联接还是可以引用不联接的表?

所示的第三张表是所需的输出。谢谢你的帮助!

| 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                  |  |
+-----+-----------+----------------------+--+

2 个答案:

答案 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(这是原始标记)。尽管众所周知,日期函数依赖于数据库,但在其他数据库中也可以表达类似的逻辑。