问题描述
我试图在一行上联接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语句提出这样的问题,您将得到更快的响应,因为它使人们不必全都输入。