多次选择同一列(SQL Server)

时间:2011-09-01 21:28:56

标签: sql-server select

注意:事后来看,我意识到这可能看起来像是一个愚蠢的问题,但在发布之前我确实研究了很多。这只是其中一个“正确在你鼻子底下”的答案,唉!

我试图将多个简单的查找表合并为一个,因为我被告知是常见做法。我将包含状态的表和包含优先级的表组合如下:

StatusPriority( ID, Name )
Projects( ID, ProjectName, StatusID, PriorityID ) --Master table

ID between 1-10的值代表我的状态,而ID between 11-20的值代表优先级。如果我将这些分成两个表,它们将是:

Status( ID, StatusName )
Priority( ID, PriorityName )

目标

我想要做的是在结果集中的两个不同的列中查询这些值,并将这些列连接到名为“Projects”的主表。我尝试了以下查询,但它不起作用:

select ProjectName, Name as Status, Name as Priority
    from Projects p left outer join
    StatusPriority st on p.StatusID = st.Name left outer join
    StatusPriority pr on p.PriorityID = pr.Name

样本结果

    ProjectName         |  Status       |  Priority
    --------------------|---------------|-----------
    Pick Blueberries    |  on hold      |  medium
    Remodel bathroom    |  in progress  |  low
    Plant garden        |  in progress  |  high

3 个答案:

答案 0 :(得分:2)

你是联接看起来错误的标准,因为我无法想象的p.StatusID将等于st.Name。其次,您需要在选择列表中使用表别名:

select ProjectName, st.Name as StatusName, pr.Name as PriorityName
    from Projects p 
    left join StatusPriority st on p.StatusID = st.ID 
    left join StatusPriority pr on p.PriorityID = pr.ID

答案 1 :(得分:2)

组合这样的表是一个SQL反模式。不要做。您现在只能通过触发器而不是FK约束来强制执行数据完整性。根据您需要使用它的频率,它也可以是数据库中出现块的区域。

“1到10之间的ID值表示我的状态,而11到20之间的ID值代表优先级”是一种非常糟糕的做法。当您需要第11个状态时会发生什么?如果必须组合表,至少要添加一列来指定哪个查找而不是依赖于数字。但坦率地说,我永远不会将查找表组合到一个表中。

答案 2 :(得分:1)

StatusID&项目中的PriorityID列表示为状态优先级的ID?这就像你正在做的那样:

select ProjectName, st.Name as Status, pr.Name as Priority
    from Projects p 
    left outer join StatusPriority st on p.StatusID = st.ID
    left outer join StatusPriority pr on p.PriorityID = pr.ID