これは、ユーザーが提起する他の問題に答えます。
SEND + MORE = MONEYここで、各文字には一意の数字があり、ゼロで始まる単語はありません。
select
top 1
S.num as S,
E.num as E,
N.num as N,
D.num as D,
M.num as M,
O.num as O,
R.num as R,
Y.num as Y,
(S.num * 1000 + E.num * 100 + N.num * 10 + D.num) as [SEND],
(M.num * 1000 + O.num * 100 + R.num * 10 + E.num) as MORE,
(S.num * 1000 + E.num * 100 + N.num * 10 + D.num) + (M.num * 1000 + O.num * 100 + R.num * 10 + E.num) as SEND_plus_MORE,
(M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num) as [MONEY]
from
Digits as S
join digits as E on E.num <> S.num
join digits as N on N.num <> S.num and N.num <> E.num
join digits as D on D.num <> S.num and D.num <> E.num and D.num <> N.num
join digits as M on M.num <> S.num and M.num <> E.num and M.num <> N.num and M.num <> D.num
join digits as O on O.num <> S.num and O.num <> E.num and O.num <> N.num and O.num <> D.num and O.num <> M.num
join digits as R on R.num <> S.num and R.num <> E.num and R.num <> N.num and R.num <> D.num and R.num <> M.num and R.num <> O.num
join digits as Y on Y.num <> S.num and Y.num <> E.num and Y.num <> N.num and Y.num <> D.num and Y.num <> M.num and Y.num <> O.num and Y.num <> R.num
where
(S.num * 1000 + E.num * 100 + N.num * 10 + D.num)
+ (M.num * 1000 + O.num * 100 + R.num * 10 + E.num)
= (M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num)
and S.num <> 0 and M.num <> 0
WHERE句で一意の数字を強制することを考えましたが、WHERE句がチェックされる前に処理する順列が多すぎると思います。
最大10桁しか扱っていないので、速度の問題ではなく、長いON句を作成するのが最善だと思います。
これは、クレイジーなON句のないFROM+WHERE句です。これにより、サーバーの実行速度が大幅に低下します。
from
Digits as S
cross join digits as E
cross join digits as N
cross join digits as D
cross join digits as M
cross join digits as O
cross join digits as R
cross join digits as Y
where
(S.num * 1000 + E.num * 100 + N.num * 10 + D.num)
+ (M.num * 1000 + O.num * 100 + R.num * 10 + E.num)
= (M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num)
and S.num <> 0 and M.num <> 0
and (select max(B.Count) from
(select COUNT(*) as Count from
(select S.num, 's' as letter -- the letters are included to make sure the unions do not merge equivalent rows
UNION select E.num, 'e'
UNION select N.num, 'n'
UNION select D.num, 'd'
UNION select M.num, 'm'
UNION select O.num, 'o'
UNION select R.num, 'r'
UNION select Y.num, 'y') as A
group by A.num
) as B
) = 1