sql - 如果记录存在于 A 中则返回记录,否则如果记录存在于 B 中则返回记录,否则返回 null

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

关于sql - 如果记录存在于 A 中则返回记录,否则如果记录存在于 B 中则返回记录,否则返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581615/

相关文章:

sql - 在考虑到性能问题的情况下,在多列的引用表中显示另一个字段

sql - 检查列值是否为零 MS SQL Server

sql - 期初和期末余额总和

javascript - POST 值未将删除的 SQL 行传递给 PHP

sql - Sql中的关系

sql - 如何将表从转储恢复到数据库?

php - Propel 在使用别名连接表时添加 CROSS JOIN 查询

mysql - 返回一个列值的结果,但不返回另一个 SQL

MySQL Select Query - 仅获取值的前 10 个字符

c# - command.ExecuteReader() 抛出异常