在SQL中合并两个表,只获取编号最高的行

在SQL中合并两个表,只获取编号最高的行,sql,sql-server-2008-r2,sql-view,Sql,Sql Server 2008 R2,Sql View,我有两个用户SQL表,其中的数据或多或少相同,我想合并这两个表,只接受MyLevel最高的用户。如果我展示我所拥有的和我想要的,也许会更有意义 表一: MyName, MyDescr, MyLevel, FromDB John, "Hey 1", 100, DB1 Glen, "Hey 2, 100, DB1 Ive, "Hey 3, 90, DB1 表二: MyName, MyDescr, MyLevel, FromDB John, "Hey 4", 110, DB2 Glen, "Hey

我有两个用户SQL表,其中的数据或多或少相同,我想合并这两个表,只接受
MyLevel
最高的用户。如果我展示我所拥有的和我想要的,也许会更有意义

表一:

MyName, MyDescr, MyLevel, FromDB
John, "Hey 1", 100, DB1
Glen, "Hey 2, 100, DB1
Ive, "Hey 3, 90, DB1
表二:

MyName, MyDescr, MyLevel, FromDB
John, "Hey 4", 110, DB2
Glen, "Hey 5", 90, DB2
Ive, "Hey 6", 90, DB2

我想归档的是(忽略问题是,您试图说一个字符串比另一个字符串多


要比较数值,您必须以某种方式将其转换为数字。一个好的开始是使用
substr(yourfieldname,n)
剪切文本。然后您可以使用convert将其键入int;
convert(int,substr(nbr,3))问题是您试图说一个字符串比另一个字符串多


要比较数值,您必须以某种方式将其转换为数字。一个好的开始是使用
substr(yourfieldname,n)
剪切文本。然后您可以使用convert将其类型转换为int;
convert(int,substr(nbr,3))在进行连接后,您可以对每列使用
CASE

SELECT 
    COALESCE(t1.MyName COLLATE DATABASE_DEFAULT, t2.MyName )  AS MyName
    ,CASE WHEN t2.MyLevel > t1.MyLevel THEN t2.MyDescr COLLATE DATABASE_DEFAULT ELSE t1.MyDescr   END AS MyDescr
    ,CASE WHEN t2.MyLevel > t1.MyLevel THEN t2.MyLevel ELSE t1.MyLevel END AS MyLevel
    ,CASE WHEN t2.MyLevel > t1.MyLevel THEN t2.FromDB COLLATE DATABASE_DEFAULT ELSE t1.FromDB  END  AS FromDB
FROM TableOne t1  
FULL JOIN TableTwo t2 ON t1.MyName = t2.MyName COLLATE DATABASE_DEFAULT


针对排序冲突进行编辑。我使用了
COLLATE DATABASE\u DEFAULT
,但您也可以选择使用特定的排序-即
COLLATE Danish\u Norwegian\u CI\u AS
。您可以在操作的任一侧使用COLLATE。

在加入后,您可以对每一列使用
CASE

SELECT 
    COALESCE(t1.MyName COLLATE DATABASE_DEFAULT, t2.MyName )  AS MyName
    ,CASE WHEN t2.MyLevel > t1.MyLevel THEN t2.MyDescr COLLATE DATABASE_DEFAULT ELSE t1.MyDescr   END AS MyDescr
    ,CASE WHEN t2.MyLevel > t1.MyLevel THEN t2.MyLevel ELSE t1.MyLevel END AS MyLevel
    ,CASE WHEN t2.MyLevel > t1.MyLevel THEN t2.FromDB COLLATE DATABASE_DEFAULT ELSE t1.FromDB  END  AS FromDB
FROM TableOne t1  
FULL JOIN TableTwo t2 ON t1.MyName = t2.MyName COLLATE DATABASE_DEFAULT


针对排序冲突进行编辑。我使用了
COLLATE DATABASE\u DEFAULT
,但您也可以选择使用特定的排序-即
COLLATE Danish\u Norwegian\u CI\u AS
。您可以在操作的任何一侧使用COLLATE。

您有机会使用SQL Server,并能够使用分析查询。
只需对两个表进行并集,并逐级查找最大值:

SELECT *
FROM
(
  SELECT *,
         ROW_NUMBER() OVER (PARTITION BY MYNAME ORDER BY MYLEVEL DESC) as Rank
  FROM
  (
    SELECT * FROM TableOne t1  
    UNION
    SELECT * FROM TableTwo t2
  ) tUnion
) tRank
WHERE RANK = 1
请注意,您需要使用
行编号
而不是
排名
,以避免重复排名


您有机会使用SQL Server,并能够使用分析查询。
只需对两个表进行并集,并逐级查找最大值:

SELECT *
FROM
(
  SELECT *,
         ROW_NUMBER() OVER (PARTITION BY MYNAME ORDER BY MYLEVEL DESC) as Rank
  FROM
  (
    SELECT * FROM TableOne t1  
    UNION
    SELECT * FROM TableTwo t2
  ) tUnion
) tRank
WHERE RANK = 1
请注意,您需要使用
行编号
而不是
排名
,以避免重复排名


对不起,我可以看出这一点解释得不太清楚,但我想取我级别中的最高数字。我将编辑我的帖子来澄清这一点。好的,我以为你只是想获得其中一列的最大值。我会接受Nenad的解决方案。对不起,我可以看出这一点解释得不太清楚,但我想取hi我的级别中最差的数字。我将编辑我的帖子来澄清这一点。好的,我以为你只是想得到其中一列的最大值。那么我会接受Nenad的解决方案。我真的很想接受这个答案,因为我似乎是我最了解的答案,但我确实有一个问题,因为我得到了这个错误
解决“丹麦语、挪威语、拉丁语、通用语、CP1、CI、AS”之间的排序冲突在“等于”操作中,
。我无法更改视图。@johnmali您的表具有不同的排序规则,而联接运算符无法解决冲突。您可以添加
COLLATE
子句,以明确说明用于联接的排序规则。我将编辑答案。我确实希望接受此答案,因为在我看来,它是最合适的一个我最了解的问题,但我确实有问题,因为我发现这个错误
无法解决“Danish_Norwegian_CI_as”和“SQL_Latin1_General_CP1_CI_as”之间的排序冲突在“等于”操作中,
。我无法更改视图。@johnmali您的表具有不同的排序规则,而联接运算符无法解决冲突。您可以添加
COLLATE
子句来明确告诉联接使用哪个排序规则。我将编辑答案。