左外连接包括来自第二表的缺失行

时间:2017-06-30 01:07:10

标签: database sqlite left-join

我在SQLite3中执行LEFT OUTER JOIN时遇到一些困难,并且无法在StackOverflow的现有文档中找到解决方案,但这可能只是...的反映....

基本上,问题是第二个表没有一些匹配的行,我希望结果集包含这些行的NULL值。

  1. 表结构:
  2. (a)带有列的tblITEMS:

    ID (integer, primary key, not null)
        DESCR (Text); i.e., description
    

    (b)带列的tblVALUES:

    ID (integer, primary key, not null)
        ITEM_ID (integer, not null, foreign key to tblITEMS.ID)
        VAL_DT (not null); i.e., the valuation date
        VALUE (real, not null, default 0)
    
    1. 数据:
    2. (a)tblITEMS有五(5)行。

      __ID__|_DESCR_|
      :----:|:-----:|
        1   | Item1 |
        2   | Item2 |
        3   | Item3 |
        4   | Item4 |
        5   | Item5 |
      

      (b)tblVALUES有四(4)行与
      (bi)两行具有相同的ITEM_ID,但VAL_DT不同 (bii)两行的ITEM_ID与(bi)不同。 (c)有零(0)行匹配两(2)个tblITEM ID。

      __ID__|_ITEM_ID_|__VAL_DT_____|__VALUE__|
      :----:|:-------:|:-----------:|:-------:|
        1   |     1   |  2000-01-01 |   10    |
        2   |     2   |  2000-01-01 |   20    |
        3   |     2   |  2010-01-01 |  200    |
        4   |     3   |  2000-01-01 |   40    |
      
      1. 所需的结果集:

        五(5)行,每个tblITEMS行一行,其中包含没有匹配ITEM_ID的tblVALUES列的NULL条目;即不存在。

      2. 提供三(3)行的SQL脚本,每行都有来自tblVALUES表的相应值。

        select a.ID, a.DESCR, b.ID as VAL_ID, b.ITEM_ID, Date(b.Val_dt) as Val_dt, b.VALUE
        from 
             tblItems a
             , tblValues b
        --left outer join tblValues on a.id = b.item_id
        where
               a.id = b.item_id
               and 
               b.val_dt = (Select Max(b.val_dt) from tblValues b  where (a.id = b.ITEM_ID))
        
        order by a.id
        
      3. 上面带有“left outer join”行的SQL脚本取消注释,结果集为:
        (a)十二(12)行 (b)三(3)个独特行中的每一行的四(4)个副本(与上面4中返回的相同)。唯一的行都具有来自tblVALUES的适当值 (c)对应于tblITEMS的零(0)行,在tblVALUES表中没有对应的行。

      4. 问题: 如何修改SQL脚本,以便结果集包含五(5)行,每个tblITEMS行一行,并且包含tblVALUES表中没有相应行的tblITEM行的NULL值?

        预期/期望的结果集:

        __ID__|_DESCR_|_ITEM_ID_|__VAL_DT_____|__VALUE__|
        :----:|:-----:|:-------:|:-----------:|:-------:|
          1   | Item1 |     1   |  2000-01-01 |   10    |
          2   | Item2 |     2   |  2010-01-01 |  200    |
          3   | Item3 |     3   |  2000-01-01 |   40    |
          4   | Item4 |  NULL   |   NULL      |  NULL   |
          5   | Item5 |  NULL   |   NULL      |  NULL   |
        

        注意:NULL可能为零或“空日期”。

1 个答案:

答案 0 :(得分:0)

我正在回答我自己的问题,因为我已经解决了这个问题。

我对解决方案的简单程度感到有些尴尬。

无论如何,我的根本问题是我没有完全理解“JOIN”子句实际上是主要“FROM”子句的一部分,这意味着连接右侧的表及其别名定义应该只出现在join子句中。

实际的解决方案是:

Select a.ID
       , a.DESCR
       , b.ID AS VALUES_ID
       , b.ITEM_ID
       , b.VAL_DT
       , b.VALUE

FROM  tblITEMS a
      LEFT OUTER JOIN tblVALUES b ON a.ID = b.ITEM_ID
                                     AND b.val_dt = (Select Max(b.val_dt)
                                           From tblVALUES b 
                                           Where a.ID = b.ITEM_ID)

Order by
      a.ID

此致 约翰