注意:事后来看,我意识到这可能看起来像是一个愚蠢的问题,但在发布之前我确实研究了很多。这只是其中一个“正确在你鼻子底下”的答案,唉!
我试图将多个简单的查找表合并为一个,因为我被告知是常见做法。我将包含状态的表和包含优先级的表组合如下:
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
答案 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