【问题标题】:Joining Two Queries onto a Shared Table将两个查询连接到共享表
【发布时间】:2015-08-08 01:17:16
【问题描述】:

我一直在努力解决通过公用表上的连接将两个查询的结果组合在一起的概念,我希望能获得一些帮助。以下是表格的粗略指南:

dbo.Asset (not returned in the SELECT statement, used for joins only)
 - dbo.Asset.AssetID
 - dbo.Asset.CatalogueID

dbo.WorkOrder
 - WorkOrderID
 - AssetID
 - WorkOrderNumber

dbo.WorkOrderSpare
 - WorkOrderID
 - WorkOrderSpareID
 - WorkOrderSpareDescription
 - ActualQuantity
 - CreatedDateTime

dbo.Catalogue
 - CatalogueID (PK)
 - CatalogueNumber
 - CatalogueDescription
 - CatalogueGroupID

dbo.CatalogueGroup
 - CatalogueGroupID
 - CatalogueGroupNumber

第一个查询:

SELECT CatalogueGroup.CatalogueGroupName,
    Catalogue.CatalogueNumber,
    Catalogue.CatalogueDescription,
    Catalogue.CatalogueID,
    Asset.IsActive
FROM CatalogueGroup
INNER JOIN Catalogue 
ON CatalogueGroup.CatalogueGroupID = Catalogue.CatalogueGroupID
INNER JOIN Asset 
ON Catalogue.CatalogueID = Asset.CatalogueID

第二次查询:

SELECT WorkOrder.WorkOrderNumber,
    WorkOrderSpare.WorkOrderSpareDescription,
    WorkOrderSpare.ActualQuantity,
    WorkOrderSpare.CreatedDateTime
FROM WorkOrder
INNER JOIN WorkOrderSpare
ON WorkOrder.WorkOrderID = WorkOrderSpare.WorkOrderID

现在我可以在 Access (WYSIWYG) 中轻松完成上述操作,方法是将 Asset/Catalogue/CatalogueGroup 连接在一起,然后将 Asset.AssetID 加入 WorkOrder.AssetID。我似乎无法通过原始代码获得任何类似于工作的东西,我认为我的逻辑对于连接是正确的(两者的结果都为 INNER JOIN),但我对此并不陌生。

任何帮助将不胜感激,任何关于我可以在哪里进一步了解此类问题的指针都会很棒。

编辑:这是我试图使用但无济于事的,我还应该提到我正在尝试在 ms-sql 中执行此操作,而不是 Access(试图摆脱拖放):

SELECT CatalogueGroup.CatalogueGroupName,
    Catalogue.CatalogueNumber,
    Catalogue.CatalogueDescription,
    Catalogue.CatalogueID,
    Asset.IsActive,
    WorkOrderSpare.WorkOrderSpareDescription,
    WorkOrderSpare.ActualQuantity,
    WorkOrderSpare.CreatedDateTime,
    WorkOrder.WorkOrderNumber
FROM (((CatalogueGroup
INNER JOIN Catalogue 
ON CatalogueGroup.CatalogueGroupID = Catalogue.CatalogueGroupID)
INNER JOIN Asset ON Catalogue.CatalogueID = Asset.CatalogueID)
INNER JOIN WorkOrderSpare 
ON WorkOrder.WorkOrderID = WorkOrderSpare.WorkOrderID)
INNER JOIN WorkOrder ON Asset.AssetID = WorkOrder.AssetID

【问题讨论】:

  • 如果您发布了您尝试运行但不起作用的代码,这可能会有所帮助。看到你的尝试可能比目前写的问题更有价值。你可能犯了一个很简单的错误,别人很容易发现。
  • 另外,不能在Access中显示WYSIWYG设计器生成的SQL查询吗? (我不记得这是否是一项功能。我已经很多年没有接触过 Access。)
  • 您想使用哪些键来连接两个结果集?或者,您希望以哪种方式合并两个结果集?
  • 我会写下我试图再次使用的代码,并会尽快发布。我试图将 dbo.Asset.AssetID 加入到 dbo.WorkOrder.AssetID 和 dbo.Asset.CatalogueID 到 dbo.Catalogue.CatalogueID
  • 您的表格布局中没有WorkOrder.AssetID。其次,这不是 Access SQL 语法,因为 Access 在多个 INNER JOIN 周围使用括号。这必须是 SQL Server 方言,尤其是带有 dbo 前缀的。

标签: sql sql-server


【解决方案1】:

我认为我看到了问题所在。假设连接本身是正确的(即您的列确实相互关联),您的连接顺序有点偏离 - 当您将 WorkOrder 连接到 WorkOrderSpare 时,这两个表都不会与您确定的任何表相关联直到查询中的那一点。可以将其视为将两个表与您到目前为止所进行的连接链分开连接 - 这几乎就像进行两个单独的连接查询一样。如果您切换最后两个它应该可以工作,这样 WorkOrder 将加入 Asset(您已经定义),然后您可以将 WorkOrderSpare 加入 WorkOrder。我还冒昧地删除了联接上的括号,这是 Access 的事情。

SELECT CatalogueGroup.CatalogueGroupName,
    Catalogue.CatalogueNumber,
    Catalogue.CatalogueDescription,
    Catalogue.CatalogueID,
    Asset.IsActive,
    WorkOrderSpare.WorkOrderSpareDescription,
    WorkOrderSpare.ActualQuantity,
    WorkOrderSpare.CreatedDateTime,
    WorkOrder.WorkOrderNumber
FROM CatalogueGroup
INNER JOIN Catalogue ON CatalogueGroup.CatalogueGroupID = Catalogue.CatalogueGroupID
INNER JOIN Asset ON Catalogue.CatalogueID = Asset.CatalogueID
INNER JOIN WorkOrder ON Asset.AssetID = WorkOrder.AssetID
INNER JOIN WorkOrderSpare ON WorkOrder.WorkOrderID = WorkOrderSpare.WorkOrderID

【讨论】:

  • @J.Young 如果上述答案对您有用,您介意点赞并接受吗?我在模拟数据库中对其进行了测试,它应该可以工作。我花了相当多的时间:)
【解决方案2】:

我认为你很接近。作为一种稍微不同的加入方法,试试这个:

SELECT CatalogueGroup.CatalogueGroupName,
  Catalogue.CatalogueNumber,
  Catalogue.CatalogueDescription,
  Catalogue.CatalogueID,
  Asset.IsActive,
  WorkOrderSpare.WorkOrderSpareDescription,
  WorkOrderSpare.ActualQuantity,
  WorkOrderSpare.CreatedDateTime,
  WorkOrder.WorkOrderNumber
FROM 
  CatalogueGroup, Catalogue, Asset, WorkOrder, WorkOrderSpare
WHERE CatalogueGroup.CatalogueGroupID = Catalogue.CatalogueGroupID
  and Catalogue.CatalogueID = Asset.CatalogueID
  and Asset.AssetID = WorkOrder.AssetID
  and WorkOrder.WorkOrderID = WorkOrderSpare.WorkOrderID

看起来它应该可以工作,但没有数据,很难知道简单的连接是否是你想要的。 (是否使用and 子句而不是内部连接语法是个人喜好问题。在样式偏好上,我喜欢表别名(如果支持),例如FROM CatalogueGroup cg,以便您可以参考cg.CatalogueGroupID等等,而不是每次都写出完整的表名。)

【讨论】:

  • 当我尝试这样做时没有发生任何事情,可能我的连接也不正确,如果我再次阅读连接以确保我的逻辑正确可能是最好的!
  • 可能是数据。这取决于模型的外观。 workOrder 和asset 之间的关系是什么(每个workOrder 只有一个asset?)这是一个sqlFiddle,您可以使用它。如果你在那里填写一些真实的数据,它可能有助于弄清楚你想要做什么。
【解决方案3】:

好的。所以你在评论中提到的错误

无法绑定多部分标识符“WorkOrder.WorkOrderID”

通常是当您有一个表的别名,而不是在JOIN 中使用别名时,您使用的是表名,或者您使用了错误的列名或表名。

理想情况下,在 SQL Server 中,您的查询应如下所示

 SELECT 
    cg.CatalogueGroupName, 
    c.CatalogueNumber, 
    c.CatalogueDescription, 
    c.CatalogueID, 
    A.IsActive,
    Wo.WorkOrderNumber,
    WoS.WorkOrderSpareDescription,
    WoS.ActualQuantity,
    WoS.CreatedDateTime
 FROM CatalogueGroup cg 
    INNER JOIN Catalogue c ON cg.CatalogueGroupID = c.CatalogueGroupID
    INNER JOIN Asset A ON c.CatalogueID = A.CatalogueID
    INNER JOIN WorkOrder Wo ON Wo.AssetID= A.AssetID
    INNER JOIN WorkOrderSpare WoS ON Wo.WorkOrderID = WoS.WorkOrderID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2016-05-27
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多