Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果A中存在记录,则返回记录else如果B中存在记录,则返回记录else null_Sql_Sql Server - Fatal编程技术网

Sql 如果A中存在记录,则返回记录else如果B中存在记录,则返回记录else null

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 ),

我试图用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
), 
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查询。