Это (надеюсь) одноразовое упражнение, поэтому не элегантное решение может быть не таким плохим, как кажется.
Проблема (как, я уверен, вы слишком осведомлены!) Заключается в том, что в какой-то момент в вашем запросе вы должны перечислить все эти столбцы. :( Вопрос в том, каков самый элегантный способ сделать это? Ниже моя попытка. Это выглядит громоздко, потому что есть так много столбцов, но это может быть то, что вы ищете, или, по крайней мере, это может указать вам в правильное направление.
Возможное решение SQL:
/* if you have N countries */
CREATE TABLE Country
(id int,
name varchar(50))
INSERT Country
SELECT 1, 'Afghanistan'
UNION SELECT 2, 'Albania',
UNION SELECT 3, 'Algeria' ,
UNION SELECT 4, 'American Samoa' ,
UNION SELECT 5, 'Andorra' ,
UNION SELECT 6, 'Angola' ,
...
UNION SELECT N-3, 'Western Sahara',
UNION SELECT N-2, 'Yemen',
UNION SELECT N-1, 'Zambia',
UNION SELECT N, 'Zimbabwe',
CREATE TABLE #tmp
(key varchar(N),
country_id int)
/* "key" field needs to be as long as N */
INSERT #tmp
SELECT '1________ ... _', 'Afghanistan'
/* '1' followed by underscores to make the length = N */
UNION SELECT '_1_______ ... ___', 'Albania'
UNION SELECT '__1______ ... ___', 'Algeria'
...
UNION SELECT '________ ... _1_', 'Zambia'
UNION SELECT '________ ... __1', 'Zimbabwe'
CREATE TABLE new_table
(country_id int,
species_id int)
INSERT new_table
SELECT species.id, country_id
FROM species s ,
#tmp t
WHERE isnull( s.Afghanistan, ' ' ) +
isnull( s.Albania, ' ' ) +
... +
isnull( s.Zambia, ' ' ) +
isnull( s.Zimbabwe, ' ' ) like t.key
Мое предложение
Лично я бы этого не делал. Я бы сделал быстрое и грязное решение, подобное тому, на которое вы ссылаетесь, за исключением того, что я бы жестко закодировал идентификаторы страны (потому что вы собираетесь делать это только один раз, верно? И вы можете сделать это сразу после создания таблицы стран, чтобы вы знали, что это за идентификаторы):
INSERT new_table SELECT Species.ID, 1 FROM Species WHERE Species.Afghanistan = 1
INSERT new_table SELECT Species.ID, 2 FROM Species WHERE Species.Albania= 1
...
INSERT new_table SELECT Species.ID, 999 FROM Species WHERE Species.Zambia= 1
INSERT new_table SELECT Species.ID, 1000 FROM Species WHERE Species.Zimbabwe= 1