如何在SQL中基于同一表的两列获取数据

时间:2018-06-21 16:44:28

标签: sql sql-server

我想从基于两列的表中检索一些数据,请参见下面的表结构

更新     我想要基于两个条件的输出数据     1.如果代码值具有“ Web”或“ Offline”。     2.备注列中的数据与Pre_memo列中的数据相同。

Table

输出应如下所示

Output

到目前为止,我通过使用同一张表两次来获得输出,但是我想通过只使用一次表来获得输出结果,以避免与性能相关的问题,因为该表包含大量数据。

select distinct OrderTable.Memo,
max(OrderTable.Memo_Date) as Date1,
max(ot.Pre_Memo_Date) as Date2
from OrderTable,
OrderTable ot
where OrderTable.code in ('Web')
and ot.code in ('Offline')
and OrderTable.Memo = ot.Pre_Memo
group by OrderTable.Memo

有人可以帮忙吗?在基于备忘录和pre_memo列的查询和过滤器中仅使用一次OrderTable,因为它具有相同的数据?

2 个答案:

答案 0 :(得分:0)

您可以使用union all并进行有条件的聚合:

select Memo, max(case when code = 'Offline' then Date end) as Memo_date,
             max(case when code = 'Web' then Date end) as Per_Memo_date
from (select Date, 'Web' as code, Pre_memo as Memo
      from OrderTable o
      where code = 'Web'
      union all
      select Date, 'Offline', Memo
      from OrderTable o
      where code = 'Offline'
    ) t
group by Memo;

答案 1 :(得分:0)

“我想从基于两列的表中检索一些数据,请参见下面的表结构”

提供样本足以说明问题(并希望在SO上做到),但这还不够,因此不能替代定义问题,您做不到。

如果没有问题的定义,我们只能猜测您要实现的目标。例如

  • 从具有“代码”值“脱机”的元组子集中,取每个出现的“备注”值的MAX()“日期”值。
  • (使用一些匹配条件)将其与具有“ Web”作为“代码值”的元组的子集相匹配,并从结果集中将那些“日期”值保留为“ Memo_date”。
  • 匹配条件是前者[中的一个元组”的'备注'值等于后者中[匹配的元组]中的'Pre_memo'值。

如果一切正确,那么这说明了为什么在SQL中至少要有两个引用而在不可能的情况。您无法避免进行某种匹配,并且按定义进行匹配需要匹配两个不同的事物(即使两个不同的事物是一个事物和同一事物的不同子集)。实际上,在一个表中同时包含这两个截然不同的东西几乎是绝对的设计错误,这可能完全出于误导,即“将所有内容都放在一个表中使事情变得更容易”。

“到目前为止,我通过使用同一张表两次获得了输出,但是我想仅通过使用该表一次来获得输出结果,以避免与性能相关的问题,因为该表包含大量数据”

从您提出问题的方式来看,我怀疑您是在寻找某种手段来利用这些“脱机”元组是“ Web”元组之后的“下一个”事实,并且您可以编写SQL这样,引擎便可以派生出一种“单次通过”算法(您可能假设会更快)。

它不能那样工作。 SQL表没有固有的顺序,因此,在表中根本就没有“下一个”之类的东西。