Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 引用第二个表的新列-是否需要联接?_Sql - Fatal编程技术网

Sql 引用第二个表的新列-是否需要联接?

Sql 引用第二个表的新列-是否需要联接?,sql,Sql,我有两个表(显示了前两个),需要从前两个表中提取第三个表-我需要进行联接,还是您可以在不联接的情况下引用表 所示的第三个表是所需的输出。谢谢你的帮助 | ACC | CALL DATE | | | +-----+-----------+--+--+ | 1 1 | 2/1/18 | | | +-----+-----------+-- +-----+---------------+--+--+ | ACC | PURCHASE DATE | | | +-----+-------

我有两个表(显示了前两个),需要从前两个表中提取第三个表-我需要进行联接,还是您可以在不联接的情况下引用表

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

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

让我们检查选项

假设您要基于前两个表中的数据创建新的第三个表,那么对其中任何一个表的每次更新/插入/删除也应该传播到第三个表中

假设您有一个视图,它可以满足您的需要,那么就不需要维护第三个表,并且每次查询时都可以从前两个表中获取所需的数据

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

当然,您可以有一个引用多个表的查询,而无需联接
union all
就是这样一个操作符的例子

还有一个问题,你所说的“加入”是什么意思。如果您指的是显式连接,那么有一些方法可以解决这个问题,比如相关子查询。但是,它们正在数据库引擎中实现某种形式的“连接”

对于您的查询,您希望将
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(它是原始标记)。类似的逻辑也可以在其他数据库中表达,尽管众所周知,日期函数依赖于数据库。

MySQL SQL Server。请指定您正在使用的RDBMS?这取决于您正在做什么。如果您需要来自多个表的数据,请连接。如果你不加入,就不要加入。嗨,欢迎加入SO。请编辑问题以显示您已尝试的内容。这样,我们将能够更好地理解您的问题,从而更好地帮助您。最好是提供一个新的解决方案。有关更多信息,请参阅并使用。