Sql 如果A中存在记录,则返回记录else如果B中存在记录,则返回记录else null
我试图用SQL来表达这个想法Sql 如果A中存在记录,则返回记录else如果B中存在记录,则返回记录else null,sql,sql-server,Sql,Sql Server,我试图用SQL来表达这个想法 If record exist in A then return record else if record exist in B return record ELSE NULL 示例:选择队长(如果有),否则选择队伍中年龄最大的球员 WITH Captains_CTE (TeamName, PlayerName) AS ( SELECT TeamName, PlayerName FROM TeamPlayer WHERE IsCaptain = 1 ),
If record exist in A then return record else if record exist in B return record ELSE NULL
示例:选择队长(如果有),否则选择队伍中年龄最大的球员
WITH Captains_CTE (TeamName, PlayerName)
AS (
SELECT TeamName, PlayerName FROM TeamPlayer WHERE IsCaptain = 1
),
OldestPlayer_CTE (TeamName, PlayerName)
AS (
SELECT TeamName, PlayerName FROM TeamPlayer AS tp
INNER JOIN (
SELECT TeamName, MAX(PlayerAge) AS MaxAge
FROM TeamPlayer
GROUP BY TeamName
) AS old ON old.TeamName = tp.TeamName AND old.MaxAge = tp.PlayerAge
)
SELECT CASE
WHEN Captains_CTE.TeamName IS NULL THEN OldestPlayer_CTE.TeamName
ELSE Captains_CTE.TeamName
END AS TeamName,
CASE
WHEN Captains_CTE.PlayerName IS NULL THEN OldestPlayer_CTE.PlayerName
ELSE Captains_CTE.PlayerName
END AS PlayerName
FROM Captains_CTE
FULL OUTER JOIN OldestPlayer_CTE ON Captains_CTE.TeamName = OldestPlayer_CTE.TeamName
我可以通过在a和B上进行外部联接,然后为我希望返回的每个列构建一个CASE语句来实现这一点,但必须有更好的方法。(是的,我的示例查询对年龄的唯一性做出了一些可怕的假设)使用
不存在:
select a.*
from a
union all
select b.*
from b
where not exists (select 1 from a where a.? = b.?); -- "?" is for the column that specifies whether the record exists in A
您可以使用APPLY
执行此操作:
SELECT t.TeamName, coalsesce(captain.PlayerName,'') As Captain
FROM Teams t
OUTER APPLY (
SELECT TOP 1 PlayerName
FROM TeamPlayers tp
WHERE tp.TeamID = t.TeamID
ORDER BY CASE WHEN tp.IsCaptain = 1 THEN 1 ELSE 2 END,
PlayerAge DESC
) captain
如果没有Teams
表(如果模式有任何意义,应该有,但您永远不知道),您可以派生一个:
SELECT t.TeamName, coalsesce(captain.PlayerName,'') As Captain
FROM (SELECT DISTINCT TeamName FROM TeamPlayers) t
OUTER APPLY (
SELECT TOP 1 PlayerName
FROM TeamPlayers tp
WHERE tp.TeamName = t.TeamName
ORDER BY CASE WHEN tp.IsCaptain = 1 THEN 1 ELSE 2 END,
PlayerAge DESC
) captain
我不知道代码和这个问题有什么关系。例如,代码中没有任何内容被称为a
或b
。您可以使用COALESCE()
来简化案例,但这只是一个旁注。我的实际答案如下。@GordonLinoff队长代码只是我想出的一个例子,而不是发布我真正可怕的50行ERP查询。