我有两个用户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或类似的时候?
答案 0 :(得分: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 DEMO 强>
编辑了排序规则冲突。我使用过COLLATE DATABASE_DEFAULT
但你也可以选择使用特定的排序规则 - 即COLLATE Danish_Norwegian_CI_AS
。您可以在操作的任一侧使用COLLATE。
答案 1 :(得分:0)
问题在于你试图说一个字符串比另一个字符串更多。
要比较数值,您必须以某种方式将这些转换为数字。一个好的开始是使用substr(yourfieldname, n)
来剪切文本。然后你可以使用convert to typecast it to int; convert(int, substr(nbr, 3)) <= 10
然后您可以加入并选择这些值的最大值。
答案 2 :(得分:0)
您有机会进入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
请注意,您需要使用ROW_NUMBER
代替RANK
,以避免重复排名。