Sql 如何选择带有3个标记的1个日期字段?

Sql 如何选择带有3个标记的1个日期字段?,sql,oracle11g,Sql,Oracle11g,我正在进行三次选择1个日期字段的查询 SELECT t1.datefield date_1, t1.datefield date_2, t1.datefield date_3 FROM table t1 WHERE t1.datefield BETWEEN To_date('01/07/2016', 'dd/mm/yyyy') AND To_date('31/07/2016', 'dd/mm/yyyy') 我需要日期1在7月1日和7月31日之间,日期

我正在进行三次选择1个日期字段的查询

SELECT t1.datefield date_1, 
       t1.datefield date_2, 
       t1.datefield date_3 
FROM   table t1 
WHERE  t1.datefield BETWEEN To_date('01/07/2016', 'dd/mm/yyyy') AND To_date('31/07/2016', 'dd/mm/yyyy') 
我需要日期1在7月1日和7月31日之间,日期2在8月1日和7月31日之间 8月31日,日期3,从9月1日到9月30日。我该怎么做

例如:

SELECT t1.date_invoice date_1, 
       t1.date_invoice date_2, 
       t1.date_invoice date_3 
FROM   invoices t1 
WHERE  t1.date_invoice BETWEEN To_date('01/07/2016', 'dd/mm/yyyy') AND To_date('31/07/2016', 'dd/mm/yyyy')

   DATE_1       DATE_2     DATE_3        
----------   ----------- -----------
01/07/2016   14/08/2016   15/09/2016 

但表只有一个
日期\u invoice

问题是,您在查询中选择了相同的日期,即使您为它指定了三个不同的名称。当您从单个表中进行选择时,将逐个获取其行。对于表中的每一行,您读取
date\u invoice
值,并在结果的所有三列中插入该值。然后对该值强制三个条件,这些条件(显然)相互矛盾,因此没有匹配的条件

您可能需要同时查看基表中的三行,并检查第一行的日期是否在7月,第二行的日期是否在8月,第三行的日期是否在9月。您可能仍然没有结果,或者正好有一个结果,或者可能有几个结果(如果7月有三张发票,8月有一张发票,9月有两张发票,您将得到总共3*1*2=6个结果)

每当您需要从一个表中选择一行,从另一个表中选择一行时,这就是连接。在您的例子中,您需要三行,因此它是两个连接。你的桌子三次都是一样的;当您将一个表连接到它自己时,这被称为“自连接”,第一次看到它时可能听起来很奇怪,但它非常常见,不同表之间的连接没有什么不同

现在,可能您在某个地方有一个订单id,并且您只查找同一订单id的发票的三倍。然后您将有一个连接条件—三行都具有相同的订单id。或者您将首先筛选基表,以便只查看具有给定订单id的行

无论如何,你问问题的方式没有“加入条件”-所有发票都必须考虑并相互匹配。这称为交叉连接或笛卡尔连接,在某些情况下非常有用;但是,通常您会看到这样的交叉联接,实际上反映了问题的错误解决方案(例如,缺少订单id上的联接条件-您将在7月份收到一份订单的发票,与8月份收到的另一份订单的发票相匹配)

按照您提出问题的方式,您想要解决的问题是重复交叉连接,如下所示:

SELECT t1.datefield date_1, 
       t2.datefield date_2, 
       t3.datefield date_3 
FROM   your_table t1 CROSS JOIN your_table t2 CROSS JOIN your_table t3 
WHERE  t1.datefield BETWEEN To_date('01/07/2016', 'dd/mm/yyyy') 
                                 AND To_date('31/07/2016', 'dd/mm/yyyy')
  AND  t2.datefield BETWEEN .... -- (dates for August)
  AND  t3.datefield BETWEEN .... -- (dates for September) 

添加示例表数据和预期结果-以及格式良好的文本!我期望的结果是date_1=07/14/2016 date_2=08/10/2016 date_3=09/15/2016,但它仅适用于从日期('01/07/2016','dd/mm/yyyyy')到日期('31/07/2016','dd/mm/yyyyy')和从日期('31/07/2016','dd/mm/yyyyyy')到日期之间的t1.date字段('01/08/2016','dd/mm/yyyy')和截至日期('31/08/2016','dd/mm/yyyy'))它会得到空数据…或者没有数据和什么表数据?我不能在这里发布这些信息…我的问题是我正在使用的查询示例…您不必发布精确的数据;您可以创建一些数据,足以证明您的问题。请参阅其他人使用sampl准确描述其问题的示例e数据。