2017-08-04 123 views
1

我试图合并这两个以下SQL Server 2008中使用UNION运算符的查询的结果,但有以下错误关键字SQL Server 2008的合并两个查询

附近有语法错误的结果,工会”。

我的代码:

SELECT TOP 1 
    CITY, LEN(CITY) 
FROM 
    table1 
ORDER BY 
    LEN (CITY), CITY ASC 

UNION 

SELECT TOP 1 
    CITY, LEN(CITY) 
FROM 
    table1 
ORDER BY 
    LEN (CITY) DESC, CITY ASC 

任何意见,将不胜感激。

感谢

+2

为了通过应该在第二个查询仅用于 – Rams

+0

为什么你需要从同一个表中选择两次相同的记录? –

+0

但仍然没有解决问题。它不会合并两个查询 – Algo

回答

0

在你的第一个选择语句中移除ASC顺序命令。只能在任何查询结束时对结果进行排序,因为在查询中间的排序(如果允许)会导致获得一致结果的许多问题。

编辑:我意识到表是一样的,你需要将所有使用联盟,或作为其他意见指出,重复的取出一个UNION。

SELECT TOP 1 
    CITY, LEN(CITY) 
FROM 
    table1 

UNION ALL 

SELECT TOP 1 
    CITY, LEN(CITY) 
FROM 
    table1 
ORDER BY 
    LEN (CITY) DESC, CITY ASC 
+0

然而,这并不能解决问题......它并没有合并什么是你想合并的结果 – Algo

+0

?你在同一张桌子上使用工会吗? – CodeSurvivor

0

在这种情况下,您可以使用公用表表达式。试试这个

;With cte 
AS (
select * , ROW_NUMBER() OVER(ORDER BY LEN (CITY) DESC, CITY ASC) as rn 
    FROM table1 
    ) 
    select * from cte where rn = 1 
    union 
    select * from cte where rn = 1 
1

这是正确的方式做到这一点

Select * From 
(
SELECT TOP 1 
    CITY, cityLen = LEN(CITY) 
FROM 
    table1 
ORDER BY 
    cityLen, CITY ASC 
) a 
UNION 
Select * From 
(
SELECT TOP 1 
    CITY, cityLen = LEN(CITY) 
FROM 
    table1 
ORDER BY 
    cityLen DESC, CITY ASC 
) b 

或使用Row_Number窗函数

select * from 
(
select *, 
     ROW_NUMBER() OVER(ORDER BY LEN (CITY) DESC, CITY ASC) as Drn, 
     ROW_NUMBER() OVER(ORDER BY LEN (CITY) ASC, CITY ASC) as Arn, 
FROM table1 
) a 
where 1 in (Arn,Drn) 
+0

第一个代码给我下面的错误没有列名是为第2栏指明B‘“a'.No列名第2栏指定’。 – Algo

+0

just alias len(city)as lencity on the first query inner select'SELECT TOP 1 CITY,LEN(CITY)as lenCity'虽然我喜欢'union all'而不是工会 – xQbert

+0

@Algo更新..现在检查.. –