仅当值存在时才如何从带有WHERE子句的联接表中选择?

问题描述

我想从table1(其中t1.id = 1)中选择一条记录,然后将table2和table3(t2.field2和t3.field3)加入到table1中,但是只有在值存在的情况下(IS NOT NULL)。>

例如,如果t3.field3的值不存在,则该表的field3列不会显示...

Utility

我试图做的代码是这样的:

   t1

 id  |  field1
---------------
 1   |   f1val
 2   |   f1val
 3   |   f1val


       t2

 id(fk)  |  field2
-------------------
 1       |   f2val
 2       |   null
 3       |   null


       t3

 id(fk)  |  field3
-------------------
 1       |   null
 2       |   f3val
 3       |   f3val

从上面的查询返回的联接表如下:

    SELECT t1.id,t2.field1,t3.field3
    FROM (
       SELECT t1.id
       FROM t1
       WHERE t1.id = 1
    )
   LEFT JOIN t2 ON t2.id = t1.id AND t2.id is not null
   LEFT JOIN t3 ON t2.id = t1.id AND t3.id is not null;

但是,由于field3为null,所以我希望它仅返回id和field2,如下所示:

 id  |  field2  | field3
----------------------------
  1  |   f1val  |  null

我们将非常感谢您的帮助。

解决方法

可以使用=返回一列:

coalesce()

但是,有时不能返回两列,有时不能返回3列。

注意:

  • 完全不需要SELECT t1.id,COALESCE(t2.field1,t3.field3) as field_2_3 FROM t1 LEFT JOIN t2 ON t2.id = t1.id LEFT JOIN t3 ON t3.id = t1.id WHERE t1.id = 1; 上的子查询。您可以仅在单个t1子句中应用过滤器。
  • WHERE的比较是不必要的,因为它们始终无法通过IS NOT NULL条件。
  • 最后一个JOIN条件大概在JOIN上。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...