Sql 将两个查询合并为一个查询

Sql 将两个查询合并为一个查询,sql,postgresql,query-performance,Sql,Postgresql,Query Performance,我不确定我是否能在一个查询中做到这一点,但我想 我需要这样的所有记录: SELECT a.field_1, a.field_2, b.field_3, b.field_4 FROM tbl_a AS a, tbl_b AS b WHERE a.field_1 = b.field_3 我还想排除这些属于这种情况的记录: IF a.field_1 IN (1,2,3,4) AND a.field_date < NOW() 如果a.field_1在(1,2,3,4)中 和a.fiel

我不确定我是否能在一个查询中做到这一点,但我想

我需要这样的所有记录:

SELECT a.field_1, a.field_2, b.field_3, b.field_4
  FROM tbl_a AS a, tbl_b AS b
 WHERE a.field_1 = b.field_3
我还想排除这些属于这种情况的记录:

IF a.field_1 IN (1,2,3,4) 
AND a.field_date < NOW()
如果a.field_1在(1,2,3,4)中
和a.field_date
更新:(很抱歉造成混乱)

  • 因此,如果字段_1等于1、2、3或4,并且有一个日期时间戳,即今天,我需要显示记录(添加到结果)
  • 如果字段_1等于1、2、3或4,并且日期时间戳小于今天(从结果中删除)
将两个结果合并到一个查询中有什么想法吗

注意(如果这有区别):

  • 字段_a可以有一个值a-z,1-99(仅两个字符)
    • 像这样的东西

      SELECT a.field_1, a.field_2, b.field_3, b.field_4
      FROM tbl_a AS a, tbl_b AS b
      WHERE a.field_1 = b.field_3
      AND (
      CASE WHEN a.field_1 IN (1,2,3,4) THEN
            CASE WHEN A.FIELD_DATE = NOW() THEN 1 ELSE 0
            END
      ELSE 1
      END) = 1
      

      下面是一个应该有效的代码:

      SELECT a.field_1, a.field_2, b.field_3, b.field_4
      FROM tbl_a AS a
      INNER JOIN tbl_b AS b ON a.field_1 = b.field_3
      WHERE 
      (a.field_1 IN (1,2,3,4) AND a.field_date = NOW())
      OR
      (a.field_1 NOT IN (1,2,3,4))
      
      请注意,如果.field是unsigned int!=0您可以替换:
      a.field\u 1 IN(1,2,3,4)
      with
      a.field\u 1 4


      这将使它在大型记录集出现问题时更快

      让我们用适当的联接重写它,并添加一个不符合排除条件的:

      SELECT a.field_1, a.field_2, b.field_3, b.field_4
        FROM tbl_a AS a JOIN tbl_b AS b ON (a.field_1 = b.field_3)
      WHERE NOT (a.field_1 IN (1,2,3,4) AND a.field_date < NOW())
      

      但我们还需要知道字段\ 1或字段\日期是否可以为空。如果是这种情况,则表达式“foo NOT IN(blah)”在foo为NULL时返回NULL。因此,您需要更具体地说明这一点。

      您想包括或排除满足第二组条件的记录吗?您这样说,“我也想排除这些属于此条件的记录:”然后您说“如果字段_1等于1,2,3或4,并且有一个日期时间戳,即今天,我需要显示该记录”所以它必须显示还是不显示?如果日期是今天,则包括,如果日期小于今天,则排除,但仅当字段_1在1、2、3或4中时才显示。我还是不明白为什么一问两答?您需要所有第一个查询的集合,加上第二个条件?的相同集合,如果是这样,您只需要对我在下面编写的查询使用union子句,非常好。正在尝试一个案例,但没有得到任何好消息,听说这对您有帮助:)此结果将只生成字段_1为1、2、3或4的项目。如果字段_1标识符是5或6怎么办?似乎应该包括这些值。我觉得这篇文章有点模糊。@N.沃菲尔德是的,这篇文章很模糊。。。我编辑了答案以符合所需的结果
      SELECT a.field_1, a.field_2, b.field_3, b.field_4
        FROM tbl_a AS a JOIN tbl_b AS b ON (a.field_1 = b.field_3)
      WHERE a.field_1 NOT IN (1,2,3,4) OR a.field_date >= NOW())