2011-06-11 83 views
0

经过阅读,我意识到SQL(MySQL在我的案例)不支持列排除。在SELECT语句中排除不明确的列(实际上是CREATE VIEW语句)

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'd,我知道user往往是在它自己的命名约定的一个糟糕的选择,我使用前缀。

+0

Inexplicable * -1 *是无益的。如果我的问题不清楚,或者表明选择不当,我想知道为什么。 – Dan 2011-06-11 17:26:01

回答

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; 

这使我可以确保知道我在视图中的内容,并且列的名称是智能地命名的,但这确实意味着我在更改基础表结构时需要触及该视图。

+0

谢谢** Stephen Wrighton **;我认为情况会是这样。当表格更改时,我没有同步我的视图的问题,但我认为没有其他选择。我也认为我目前的解决方案是次优的。 – Dan 2011-06-11 17:29:59

+0

我没有看到其他选择,但同时我没有看过。主要是因为我喜欢这种做事的方式,因为我喜欢控制。 – 2011-06-11 17:36:40

+0

听起来不错。我相信这将是我的选择。我希望有一个主要用于开发目的的动态替代方案,转移到专门的视图定义进行部署。我不妨第一次“对”。 – Dan 2011-06-11 17:39:43