Это решает другую проблему, поставленную пользователем.
ОТПРАВИТЬ + БОЛЬШЕ = ДЕНЬГИ, где каждый символ имеет уникальную цифру, и ни одно слово не начинается с нуля.
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 вместо соображений скорости.
Вот предложение FROM + WHERE без сумасшедших предложений ON. На моем сервере это работает НАМНОГО медленнее.
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
person
Brian Webster
schedule
27.02.2013