如果join返回null,则在默认行上进行联接

问题描述

我试图在一行上联接2个表,如果该行为空,则将该行联接到认行。

表1:事件

EventID     EventName
----------- -------------
1           January
2           February
3           march
4           April

表2:菜单

MenuID     EventID     MenuVersion     
---------- ----------- --------------- 
1                      1
2          3           2
3          4           4
4                      4

我尝试过的事情

SELECT * FROM Events
LEFT JOIN Menus
ON Events.EventID = Menus.EventID

我得到的输出

EventID     EventName     MenuID    EventID    MenuVersion
----------- ------------- --------- ---------- ---------------
1           January                           
2           February                          
3           march         2         3          2
4           April         3         4          4

在这种情况下,Menus表的认行是最高MenuID和空EventID的行。

我想要的输出

EventID     EventName     MenuID    EventID    MenuVersion
----------- ------------- --------- ---------- ---------------
1           January       4                    4
2           February      4                    4
3           march         2         3          2
4           April         3         4          4

解决方法

Cross apply默认行,并且在left join中没有行的情况下使用其值。

DECLARE @Events TABLE (EventId INT,EventName VARCHAR(12));
DECLARE @Menus TABLE (MenuId INT,EventId INT,MenuVersion INT);

INSERT INTO @Events (EventId,EventName)
VALUES
(1,'January'),(2,'February'),(3,'March'),(4,'April');

INSERT INTO @Menus (MenuId,EventId,MenuVersion)
VALUES
(1,null,1),3,2),4,4),4);

SELECT E.EventId,E.EventName,COALESCE(M.MenuId,D.MenuId) MenuId,M.EventId,COALESCE(M.MenuVersion,D.MenuVersion) MenuVersion
FROM @Events E
LEFT JOIN @Menus M ON M.EventID = E.EventID
CROSS APPLY (SELECT TOP 1 * FROM @Menus WHERE EventId IS NULL ORDER BY MenuId DESC) D;

根据要求返回:

EventId EventName   MenuId  EventId MenuVersion
1       January     4       NULL    4
2       February    4       NULL    4
3       March       2       3       2
4       April       3       4       4

注意:如果以后用DDL / DML语句提出这样的问题,您将得到更快的响应,因为它使人们不必全都输入。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...