在SELECT语句中排除不明确的列(实际上是CREATE VIEW语句)

时间:2011-06-11 17:15:26

标签: sql view duplicates

阅读后,我意识到SQL(我的情况下 MySQL )不支持列排除。

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

无论如何,虽然我接受了这一点,但我想知道是否有任何体面的解决方法来实现这种行为。原因是,我正在创建一个视图来整合几个表格中的信息。

我已将一些用户数据规范化为表useruser_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,我知道user通常是自己命名约定的不良选择,我使用前缀。

1 个答案:

答案 0 :(得分:1)

通常,我会在视图中定义我想要的字段

使用您的示例:

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;

这使我能够确保我知道我的视图中的内容,以及智能地命名列,但这确实意味着当我对基础表结构进行更改时,我需要触摸该视图。