在同一表格中按一列进行比较

时间:2018-07-26 07:06:25

标签: sql oracle

我有一个带有这些寄存器的表

ColumnA     ColumnB
apple       180725
banana      180725
apple       180724

我只想获取columnA昨天和两天前出现的寄存器。

如何在sql中执行这些操作。有两个表很容易,但是在一个表中却不知道怎么做。

谢谢你,我的英语!

2 个答案:

答案 0 :(得分:1)

  

日期为columnB

使用DATE数据类型保存日期是一种很好的做法。在Oracle中,我们可以对日期进行算术运算,因此实际上无需将它们存储为数字,尤其是没有世纪时也可以将它们存储为数字。

无论如何,自我联接与任何其他联接一样,都具有表别名以区分它们:

select t1.columnA
from your_table t1
     inner join your_table t2
     on t1.columnA = t2.columnA 
where t1.columnB = to_number(to_char(sysdate,'yymmdd'))-1
and  t2.columnB = to_number(to_char(sysdate,'yymmdd'))-2

这也可以

and  t2.columnB = t1.columnB - 1

如果columnB是DATE列,则WHERE子句为:

where t1.columnB = trunc(sysdate)-1
and  t2.columnB = trunc(sysdate)-2

答案 1 :(得分:0)

首先要说的是,用户APC给您的答案是正确的。您不妨使用自我连接并获得正确的结果。 我在写这个答案只是为了向您建议另一种方法,我认为这在性能和原则上都更好:

select t1.columna
 from your_table t1
where t1.columnb = to_number(to_char(sysdate,'yymmdd'))-1
  and t1.columna = (select t2.columna 
                      from your_table t2
                     where t1.columna = t2.columna
                       and t2.columnb = to_number(to_char(sysdate,'yymmdd'))-2)

原理: 仅在需要从表中选择一些数据(列值)时才联接表。否则,最好像我在答案中所写的那样,通过where子句中的条件进行连接。 在您的示例中,由于数据量少,对该原则的需求可能并不那么明显。但是,如果您需要将更多(可能更大)的表联接到该查询,则额外的联接将比现在对性能的影响更大。因此,最好避免使用不需要的联接(不要选择其表列)。

第一个查询的性能: Link: If your query is heavier with data than presented in your question and you plan to join more tables to this one, it might negatively affect performance of your query

第二个查询的性能,我向您建议: Link: Uses only half the amount of bytes, and lesser is better!