【问题标题】:SQL SERVER 2008 - joinsSQL SERVER 2008 - 连接
【发布时间】:2016-11-22 17:53:18
【问题描述】:

我尝试加入三个表以获取必要的数据。他们来了……

*TblComp*        *TblCompParent*         *tblCompProcesses*
CompID            CompBillingID           CompID
CompBillingID     Capacity1               CompProcessID
                  Capacity2

所以我想用这三个表做的是......

Select tblCompParent.Capacity1, tblCompParent.Capacity2, CompProcessID

我的问题是...在 tblComp 中有 351 个值 - 所以我首先加入 tblComp 和 tblCompparent 并选择 tblCompparent.capacity1、tblcompparent.capacity2,查询看起来像这样...

SELECT dbo.tblComp.CompID, dbo.tblCompParents.Capacity1, dbo.tblCompParents.Capacity2
FROM dbo.tblCompParents INNER JOIN
dbo.tblComp ON dbo.tblCompParents.CompBillingID = dbo.tblComp.CompBillingID

这很好用,当我尝试加入 tblCompProcess 以提取 CompProcessID 时,我得到了 580 条记录。我不确定我必须在 tblCompprocess 上做什么才能为每个 compID 选择一个 CompProcessID。

看来我必须使用 tblComp,否则我将无法加入 tblCompProcess。

编辑1:

SELECT dbo.tblComp.CompID, dbo.tblCompParents.Capacity1, dbo.tblCompParents.Capacity2, tblCompProcess.compprocessID
FROM dbo.tblCompParents INNER JOIN
dbo.tblComp ON dbo.tblCompParents.CompBillingID = dbo.tblComp.CompBillingID
Inner Join dbo.tblCompprocess on tblCompProcess.CompID = tblComp.CompID

【问题讨论】:

  • 您没有显示最终的 sql -- 请显示您正在使用的确切 sql。我们需要看到一个有两个连接的连接,而不仅仅是一个连接。
  • 是的,即使您没有将其中的字段包含在选择列表中,您也需要连接所有三个表。
  • 除非 tblCompProcesses 对 CompID 具有唯一约束,否则您的某些 CompID 上很可能有多个 CompProcessID。鉴于此,您是否希望获取每个 CompID 的最大或最小 CompProcessID?
  • @AlexKudryashev 我明白了——似乎当我加入第三张桌子时,我得到了奇怪的记录数
  • @user6576015 无论您是否从联接表中选择任何内容都不会影响它对结果集的贡献的行数。它总是加入的。如果任何一对连接条件匹配多于 1 行,则将全部返回,并且总行数将相应增加。因此,如果加入一个表会增加您的行数,那么该表在其他表中有 >= 1 个匹配行的 >1 行。没有其他方法可以发生这种情况。

标签: sql sql-server sql-server-2008 select join


【解决方案1】:

您没有向我们展示整个数据模型,所以我不知道到底发生了什么,但显然 tblCompProcesses 在您的联接中有不止一行。我会这样修复它:

SELECT dbo.tblComp.CompID, dbo.tblCompParents.Capacity1, dbo.tblCompParents.Capacity2, x.compprocessID
FROM dbo.tblCompParents
INNER JOIN dbo.tblComp ON dbo.tblCompParents.CompBillingID = dbo.tblComp.CompBillingID
INNER JOIN (SELECT DISTINCT CompID, compprocessID
            FROM dbo.tblCompprocess) X on x.CompID = tblComp.CompID

【讨论】:

  • 如果我没有从 tblCompProcess 中选择任何东西,我该怎么做?
  • @user6576015 同样,无论您是否选择从连接表中选择列,结果都是相同的 - 但如果您没有从中选择任何内容,那么您为什么要加入它?可能有一个有效的数据原因,但目前还不清楚。
  • 也许您的意思是正在从中选择其他列?在这种情况下,只需将它们添加到子查询中。
  • @user6576015 很高兴为您提供帮助!这听起来像是where 是“这是我想看到的Process”,而joins 只是为了让你从Process 到你的其他表.而听起来你是从对面看的。为了将这样的事情概念化,我倾向于将我关心的“主”表写成我的from,然后将所有其他人加入其中。然后,再次将 joins 和 wheres 视为逻辑上独立的实体,这确实很有帮助。
  • @underscore_d 如果有多对 CompID, compprocessID,你是正确的,仍然会有多对。通常当我看到这种问题时,只会有关联的值(compprocessID),​​但会有多行。我的解决方案将在这些情况下有所帮助,但在此处的特定情况下没有帮助——我需要知道要使用哪个 compprocessID 的业务规则,然后我才能过滤到这些结果。我认为 OP 在发布问题后更好地理解了这个问题。
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 2011-07-26
  • 2015-05-28
  • 1970-01-01
  • 2012-04-21
  • 2011-10-28
  • 2013-01-11
相关资源
最近更新 更多