Sql server 多次选择同一列(SQL Server)

Sql server 多次选择同一列(SQL Server),sql-server,select,Sql Server,Select,注意:事后看来,我意识到这似乎是一个愚蠢的问题,但在这里发布之前,我确实做了很多研究。这只是你眼皮底下的一种回答,啊 我曾尝试将多个简单的查找表合并为一个,因为我被告知这是一种常见的做法。我将包含状态的表和包含优先级的表组合在一起,如下所示: StatusPriority( ID, Name ) Projects( ID, ProjectName, StatusID, PriorityID ) --Master table ID值在1-10之间表示我的状态,ID值在11-20之间表示优先级。如

注意:事后看来,我意识到这似乎是一个愚蠢的问题,但在这里发布之前,我确实做了很多研究。这只是你眼皮底下的一种回答,啊

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

StatusPriority( ID, Name )
Projects( ID, ProjectName, StatusID, PriorityID ) --Master table
ID值在1-10之间表示我的状态,ID值在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
样本结果

项目中的StatusID和PriorityID列是否表示为Status Priority的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
项目中的StatusID和PriorityID列是否表示为Status Priority的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

您的连接条件看起来是错误的,因为我无法想象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

您的连接条件看起来是错误的,因为我无法想象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

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


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

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


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

您将得到一个模棱两可的列错误,因为它不知道名称是指圣名还是pr.NameThank Aaron,忽略了这一点。现在更正。您将得到一个模棱两可的列错误,因为它不知道名称是指圣名还是pr.Name感谢亚伦,忽略了这一点。现在更正。这是生活中你觉得自己是个十足的白痴的时刻之一,哈哈。事实上,在你回答之前我就意识到了这一点,但你完全正确。谢谢:……另一方面,我想我知道答案,但是当组合这样的表时,引用完整性可以被强制执行吗?我认为可能有一个额外的CodeCategory列和更复杂的约束,但在我看来,这比它的价值更麻烦。即使是这样,每次引用组合代码表时都需要对约束进行编码,以将键限制为特定硬编码编码编码类别的键。这是生活中你感觉自己像个十足的白痴的时刻之一,哈哈。事实上,在你回答之前,我才意识到这一点,但你完全正确。谢谢:……另一方面,我想我知道答案,但是当组合这样的表时,引用完整性可以被强制执行吗?我认为可能有一个额外的CodeCategory列和更复杂的约束,但在我看来,这比它的价值更麻烦。即使是这样,在每次引用组合代码表时也需要对约束进行编码,以将键限制为特定硬编码编码编码类别的键。哇,非常感谢您的建议。你是我非常尊重的用户。我相信你有很好的理由。对于我自己的学习,你能给我一个例子,说明即使所有的组合表都是非常静态的,这如何会导致糟糕的事情发生?再次感谢:@chiramishu当它们组合在一起时,FK约束将无法阻止您使用Projects.PriorityID字段引用状态id 7。因此,您失去了DB作为安全网和防止坏数据/错误的能力。如果您确实按照HLGEM的建议添加了CodeCategory列,那么我认为您可以创建更复杂的约束
例如,将PriorityID限制为PriorityCodeCategory的唯一ID。因此,您正在为自己创建更多的工作。此外,我发现我的代码表通常不仅仅有ID和文本,还有其他列来帮助客户端应用程序。一个简单的例子是县表,其中包含来自不同标准(如FIPS)的县代码的多个列以及缩写县名称。另外,单独的代码表使实现新代码变得更容易,这实际上是一种无需编码或部署工作即可实现对客户端应用程序的更改的方法。通常,在面对这样的机会之前,我们看不到这一点的用处。@AaronLS的确,我确实考虑过错误的数据问题。经过进一步的思考,我认为通过合并表格,我真的什么也得不到,只有头疼,而且没有任何真正的好处。我仍然有相同数量的连接,相同数量的行;只有更少的表,但没有引用完整性。看来既然我没有优势,最好还是再把他们分开。我感谢你的评论,亚伦,非常感谢;它也成为了一个热点,太多的查询被引用,最终可能导致锁。哇,非常感谢你的建议。你是我非常尊重的用户。我相信你有很好的理由。对于我自己的学习,你能给我一个例子,说明即使所有的组合表都是非常静态的,这如何会导致糟糕的事情发生?再次感谢:@chiramishu当它们组合在一起时,FK约束将无法阻止您使用Projects.PriorityID字段引用状态id 7。因此,您失去了DB作为安全网和防止坏数据/错误的能力。如果您确实按照HLGEM的建议添加了CodeCategory列,那么我认为您可以创建更复杂的约束,例如将PriorityID限制为PriorityCodeCategory的唯一ID。因此,您正在为自己创建更多的工作。此外,我发现我的代码表通常不仅仅有ID和文本,还有其他列来帮助客户端应用程序。一个简单的例子是县表,其中包含来自不同标准(如FIPS)的县代码的多个列以及缩写县名称。另外,单独的代码表使实现新代码变得更容易,这实际上是一种无需编码或部署工作即可实现对客户端应用程序的更改的方法。通常,在面对这样的机会之前,我们看不到这一点的用处。@AaronLS的确,我确实考虑过错误的数据问题。经过进一步的思考,我认为通过合并表格,我真的什么也得不到,只有头疼,而且没有任何真正的好处。我仍然有相同数量的连接,相同数量的行;只有更少的表,但没有引用完整性。看来既然我没有优势,最好还是再把他们分开。我感谢你的评论,亚伦,非常感谢;引用过多的查询可能导致锁,这也成为一个热点。