1

我有两个用户 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

我想要归档的内容(忽略 <--):

MyName, MyDescr, MyLevel, FromDB
John, "Hey 4", 110, DB2
Glen, "Hey 2, 100, DB1
Ive, "Hey 6", 90, DB2 <-- doesn't matter which one as it is the same level

当然这是可能的,但我对 JOIN 真的一无所知,尤其是在需要对它进行 GROUP 或类似操作时?

4

3 回答 3

1

加入后,您可以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

SQLFiddle 演示

针对排序规则冲突进行了编辑。我用过COLLATE DATABASE_DEFAULT,但您也可以选择使用特定的排序规则 - 即COLLATE Danish_Norwegian_CI_AS. 您可以在操作的任一侧使用 COLLATE。

于 2013-09-30T09:10:07.870 回答
0

问题是您试图说一个字符串比另一个字符串多。

要比较数值,您必须以某种方式将它们转换为数字。一个好的开始是使用substr(yourfieldname, n)剪切文本。然后您可以使用 convert 将其类型转换为 int;convert(int, substr(nbr, 3)) <= 10

然后,您可以加入并选择这些值中的最大值。

于 2013-09-30T09:06:26.107 回答
0

您有机会在 SQL Server 中,并能够使用分析查询。
只需将两个表合并,并按 Level 求最大值:

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

请注意,您需要使用ROW_NUMBER而不是RANK避免重复排名。

SQLFiddle 演示

于 2013-09-30T09:16:42.307 回答