首页 > 解决方案 > 连接表以获取丢失的记录

问题描述

我有一个参考表

NAV_ID int
NAV_FRQ varchar(20)

价值观

1 DAILY     
2 WEEKLY 
3 MONTHLY 

和一个数据表

CUST_ID varchar(10)
NAV_FRQ varchar(20)
NAV_VALUE INT

价值观

C1  DAILY   10
C2  DAILY   20
C3  WEEKLY  40
c3  MONTHLY 80

我正在尝试获得以下输出

C1  DAILY       10
C1  WEEKLY      NULL
C1  MONTHLY     NULL
C2  DAILY       20
C2  WEEKLY      Null
C2  MONTHLY     NULL
C3  DAILY       NULL
C3  WEEKLY      40
C3  MONTHLY     80

我尝试了以下查询,但这不起作用,

select a.CUST_ID
          ,b.NAV_FRQ
         ,CASE WHEN a.NAV_FRQ = b.NAV_FRQ THEN b.NAV_VALUE ELSE NULL END AS NAV_VALUE
    from table_a a cross join table_b b

标签: sqlsql-server

解决方案


您需要到CROSS JOIN您的客户表(我假设您有,但没有向我们提供示例),然后LEFT JOIN. 因此:

SELECT C.CUST_ID,
       RT.NAV_FRQ,
       DT.NAV_VALUE
FROM Customer C
     CROSS JOIN ReferenceTable RT
     LEFT JOIN DataTable DT ON C.CUST_ID = DT.Cust_ID
                           AND RT.NAV_FRQ = DT.NAV_FRQ;

如果您没有客户表,那么我建议您制作一个,因为DataTable如果不组合多个列,您的表将不会具有唯一值(这会问一个问题,客户的信息存储在哪里?)并保留您的数据结构处于非标准化状态。


推荐阅读