三个联接表,需要一个查询响应

时间:2018-11-04 11:35:09

标签: sql sql-server

我在这个查询上已经苦苦挣扎很长时间了,非常感谢任何建议。给定以下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

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

干杯, 基因

2 个答案:

答案 0 :(得分:0)

您可以尝试使用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

答案 1 :(得分:0)

从xxx组的“第一”,“最后”选择“第一,最后,最大(优先)”

应该可以。

SELECT 
    [First], [Last], max([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
GROUP BY First, Last