Исключить неоднозначные столбцы в операторе SELECT (фактически оператор CREATE VIEW) - PullRequest
0 голосов
/ 11 июня 2011

После прочтения я понял, что SQL ( MySQL в моем случае ) не поддерживает исключение столбцов.

SELECT *, NOT excluded_column FROM table; /* shame it doesn't work */

В любом случае, хотя я и согласился с этим, мне интересно, есть ли достойные обходные пути для достижения такого поведения. Причина в том, что я создаю представление для объединения информации в нескольких таблицах.

Я нормализовал некоторые пользовательские данные в таблицах user и user_profile среди других; целью является то, что user хранит данные, критичные для пользовательских операций, а user_profile хранит некритические данные. Требования к приложениям все еще реализуются, поэтому столбцы добавляются / удаляются из user_profile по мере необходимости, и в дальнейшем могут поддерживаться дополнительные таблицы, которые будут включены в представление.

Проблема в том, что при создании представления я получаю Error 1060: Duplicate Column Name, потому что user_id присутствует в обеих таблицах.

Итак, решение, которое я до сих пор предлагал, в основном:

/* exclude user_id from user */
SELECT user.critical_field, user.other_critical_field,
       user_profile.*
FROM user
LEFT JOIN user_profile
ON user.user_id = user_profile.user_id;

Поскольку таблица user будет оставаться неизменной на протяжении всего жизненного цикла приложения (, надеюсь, ), этого может быть достаточно, но мне было просто любопытно, существует ли более динамичный подход.

( Имена таблиц не были copypasta'd, я знаю, user часто является плохим выбором именования самостоятельно, я использую префиксы. )

1 Ответ

1 голос
/ 11 июня 2011

Обычно я определяю, какие поля я хочу видеть в моем представлении

Используя ваш пример:

SELECT user.critical_field, user.other_critical_field,
       user_profile.User_Id, user_profile.MyOtherOfield
FROM user
LEFT JOIN user_profile
ON user.user_id = user_profile.user_id;

Теперь, кроме того, я позабочусь о том, чтобы я правильно называл вещи:

SELECT u.critical_field, u.other_critical_field,
           up.User_Id, up.MyOtherOfield, u.KeyField AS userKey, up.KeyField as ProfileKey
    FROM user as u
    LEFT JOIN user_profile as up
    ON u.user_id = up.user_id;

Это позволяет мне убедиться, что я знаю, что у меня на уме, и что столбцы названы разумно, но это значит, что мне нужно будет касаться этого представления при внесении изменений в базовые структуры таблицы.

...