首页 > 解决方案 > 三个联表,需要一个查询响应

问题描述

我已经为这个查询苦苦挣扎了很长时间,并且非常感谢任何建议。给定以下 SQL 示例表:

CREATE TABLE #Table1
(
    [First] VARCHAR(10),
    [Last] VARCHAR(10),
    [Priority] INT
)

INSERT INTO #Table1 ([First], [Last], [Priority]) 
VALUES ('My', 'Name', '1'), ('Her', 'Name', '1'), ('His', 'Name', '1');

CREATE TABLE #Table2
(
    [First] VARCHAR(10),
    [Last] VARCHAR(10),
    [Priority] INT 
)

INSERT INTO #Table2 ([First], [Last], [Priority]) 
VALUES ('My', 'Name', '2'), ('Her', 'Name', '2'), ('His', 'Name', '2');


CREATE TABLE #Table3
(
    [First] VARCHAR(10),
    [Last] VARCHAR(10),
    [Priority] INT 
)

INSERT INTO #Table3 ([First], [Last], [Priority]) 
VALUES ('My', 'Name', '3'), ('Her', 'Name', '3'), ('His', 'Name', '3');

我试图从具有最高优先级的表中查询每个名称的单个记录。以下查询返回所有表中的所有名称,而不是所需的结果。

SELECT 
    [First], [Last], [Priority] 
FROM
    (SELECT [First], [Last], [Priority] 
     FROM #Table1 
     UNION ALL
     SELECT [First], [Last], [Priority] 
     FROM #Table2 
     UNION ALL
     SELECT [First], [Last], [Priority] 
     FROM #Table3) D3
ORDER BY 
    [Priority] DESC

查询结果不是这样需要的:

First   Last    Priority
------------------------
My      Name      3
Her     Name      3
His     Name      3
My      Name      2
Her     Name      2
His     Name      2
My      Name      1
Her     Name      1
His     Name      1

我尝试使用 TOP 1、DISTINCT、MAX(Priority) 过滤掉优先级较低的表值。但从来没有得到以下预期的结果。

First   Last    Priority
------------------------
My      Name       3
Her     Name       3
His     Name       3

提前感谢您抽出时间查看我的问题以及您可能提供的任何建议或指导。

干杯,基因

标签: sqlsql-server

解决方案


您可以尝试使用ROW_NUMBER窗口函数按[First] [Last]列生成行号,然后获取第一行。

SELECT [First], [Last], [Priority]  
FROM (
    SELECT [First], [Last], [Priority],ROW_number() over(partition by [First], [Last] order by Priority desc) rn
    FROM
    (
       SELECT [First], [Last], [Priority] FROM #Table1 UNION ALL
       SELECT [First], [Last], [Priority] FROM #Table2 UNION ALL
       SELECT [First], [Last], [Priority] FROM #Table3
    ) D3
) t1
where rn = 1

sqlfiddle


推荐阅读