2012-02-13 3 views
10

Я пытаюсь найти ошибку в массивном заявлении SQL (не мое) - я вырезал много его, чтобы сделать его доступным для чтения - даже урезанный до сих пор бросает ошибкуSQL Дубликат имя столбца ошибка

SELECT DISTINCT Profiles.ID 
FROM 
    (select * from Profiles RIGHT JOIN FriendList ON (FriendList.Profile = 15237) 
    order by LastLoggedIn DESC) as Profiles 

Это возвращает ошибку

Дубликат имя столбца «ID»

Я протестировал последнюю часть (select * from Profiles ... order by LastLoggedIn DESC) и она отлично работает сама по себе

Я попытался устранить неполадки, изменив имена столбцов в разделе DISTINCT без везения.

Одним из решений, которое я прочитал, было удаление DISTINCT, но это не помогло.

Я просто не вижу, откуда может возникать ошибка повторяющегося столбца. Может ли быть проблемой целостности базы данных?

Любая помощь очень ценится.

+0

Есть ли столбец идентификатора в таблице профилей, который противоречит столбцу идентификатора другой таблицы? Вы выбираете все столбцы, я бы рекомендовал уменьшить количество выбранных столбцов (изменить * на имена столбцов) и посмотреть, устраняет ли это вашу проблему. – Robert

+0

Не может быть, что таблица 'Profiles' и' FriendList' в вашем внутреннем 'SELECT' имеет столбец' ID'? Таким образом, у вас будет в основном два столбца, оба называются 'ID', и вы выбираете ** все ** из этого' JOIN', поэтому в качестве идентификатора вы указываете, когда вы говорите 'SELECT DISTINCT Profiles.ID .. ... '?!?!? –

+0

marc_s & Robert - да, это то, что происходит. Я догадался, но это выходит за рамки моего понимания SQL. Проблема в том, что оператор SQL является MASSIVE и динамически создается.Я разрезал его на голые кости для этого вопроса. Я собираюсь подбросить его обратно человеку, поскольку удары по эффекту возиться с этим или с db слишком ужасны, чтобы созерцать. – Steve

ответ

10

Ваши Profile и FriendList таблицы обе имеют столбец ID. Поскольку вы говорите select *, вы получаете два столбца с именем ID в подвыборке, который является псевдонимом Profiles, а SQL не знает, к какому из них относится Profiles.ID (обратите внимание, что Profiles здесь ссылается на псевдоним подзапроса , а не таблицей с тем же именем).

Так как вам нужно только столбец ID, вы можете изменить его к этому:

SELECT DISTINCT Profiles.ID FROM 
(select Profiles.ID from Profiles RIGHT JOIN FriendList ON (FriendList.Profile = 15237) 
order by LastLoggedIn DESC) as Profiles 
0

у вас есть таблица с именем анкеты и вы «создать» временную таблицу, называется профили в С, что было бы моя догадка о том, что вызывает проблему. звоните своим бананам temp и попробуйте SELECT DISTINCT bananas.ID FROM и посмотрите, работает ли это

0

Как говорится в ошибке, каждая из таблиц, с которыми вы соединяетесь, имеет столбец с именем ID. Вам нужно будет указать, какой столбец ID вы хотите (Profiles.ID или FriendList.ID) или включить ID в условия соединения.

0

Профили и FriendList имеют столбец идентификаторов. Вы запрашиваете полное соединение «Профили», а затем используете Profiles.ID, но SQL не знает, какой идентификатор вы имеете в виду.

1

Замените «select *» на «select col1, col2 ...», и ошибка должна стать очевидной (т. Е. Несколько столбцов с именем «ID»). Ничего общего с целостностью или целостностью базы данных.

Смежные вопросы