如何在内部联接上返回空值

时间:2018-05-01 13:54:19

标签: sql-server

我写了这个查询,它从另一个表中返回unique_ID和最大音符编号。问题是我还需要它来显示空值的注释号的唯一ID(I.E.没有最大值)。这可以从这个查询中做到吗?我已经尝试了所有我能想到的东西,这就是我所能得到的。

SELECT
            q.[Unique ID]
            ,qn.[Note Number], qn.*, q.*
FROM
            Q_NOT_PROC  q
LEFT JOIN   QUEUE_NOTES qn ON qn.[Order Item UniqueID]  = q.[Unique ID]
INNER JOIN
(
    SELECT
            qn.[Order Item UniqueID]
            ,MAX(qn.[Note Number])  NoteNum
    FROM
            QUEUE_NOTES qn
    JOIN    Q_NOT_PROC  q ON q.[Unique ID]  = qn.[Order Item UniqueID]
    GROUP BY
            qn.[Order Item UniqueID]
) b ON  b.[Order Item UniqueID] = q.[Unique ID]
    AND b.NoteNum               = qn.[Note Number];

如果它返回音符编号6,那么这也意味着音符编号为0-5。我只是想看看最大音符编号。我还需要看到没有笔记的那些(null)

目前的回报:

+-----------+----------+ | Unique_ID | Note Num | +-----------+----------+ | U_ID1 | 6 | | U_ID2 | 4 | | U_ID3 | 2 | +-----------+----------+

我需要它返回:

+-----------+----------+ | Unique_ID | Note Num | +-----------+----------+ | U_ID1 | 6 | | U_ID2 | 4 | | U_ID3 | 2 | | U_ID4 | null | | U_ID5 | null | +-----------+----------+

2 个答案:

答案 0 :(得分:2)

只需将inner join更改为left join

即可
SELECT q.[Unique ID], b.[Note Number]
FROM Q_NOT_PROC q
LEFT JOIN QUEUE_NOTES qn
     ON qn.[Order Item UniqueID] = q.[Unique ID]
LEFT JOIN ( -- Do left join instead of inner join
       SELECT qn.[Order Item UniqueID] , MAX(qn.[Note Number]) NoteNum
       FROM QUEUE_NOTES qn
       JOIN Q_NOT_PROC q ON q.[Unique ID] = qn.[Order Item UniqueID]          
       GROUP BY qn.[Order Item UniqueID]
  ) b ON b.[Order Item UniqueID] = q.[Unique ID] AND 
         b.NoteNum = qn.[Note Number];

修改 问题后编辑

SELECT Q.[Unique ID], b.NoteNum
FROM Q_NOT_PROC Q LEFT JOIN (
       SELECT [Order Item UniqueID] UniqueId, MAX([Note Number]) NoteNum
       FROM QUEUE_NOTES qn
       GROUP BY [Order Item UniqueID]) b ON b.UniqueId = Q.[Unique ID]

答案 1 :(得分:0)

我明白了。

SELECT q.[Unique ID], qn.[Note Number], qn.*, q.* FROM Q_NOT_PROC qnp LEFT JOIN QUEUE_NOTES qn ON qn.[Order Item UniqueID] = qnp.[Unique ID] INNER JOIN ( SELECT qn.[Order Item UniqueID] , MAX(qn.[Note Number]) NoteNum FROM QUEUE_NOTES qn JOIN Q_NOT_PROC qnp ON qnp.[Unique ID] = qn.[Order Item UniqueID] GROUP BY qn.[Order Item UniqueID] ) b ON b.[Order Item UniqueID] = qnp.[Unique ID] AND b.NoteNum = qn.[Note Number] UNION ALL SELECT q.[Unique ID], qn.[Note Number], qn.*, q.* FROM Q_NOT_PROC qnp LEFT JOIN QUEUE_NOTES qn ON qn.[Order Item UniqueID] = qnp.[Unique ID] WHERE qn.[Note Number] IS NULL