SQL Server相关查询

4

我目前有一些SQL代码如下所示。

SELECT
    WORKORDER_BASE_ID As 'Work Order',
    SCHED_START_DATE AS 'Scheduled Start',
    SETUP_HRS AS 'Approx Setup Hrs',
    RUN_HRS AS 'Approx Run Hrs',
    (
        SELECT 
            PART_ID as "Components" 
        FROM 
            REQUIREMENT 
        WHERE 
            REQUIREMENT.WORKORDER_BASE_ID = OPERATION.WORKORDER_BASE_ID
            AND REQUIREMENT.WORKORDER_SUB_ID = OPERATION.WORKORDER_SUB_ID
            AND PART_ID LIKE '%PSU%'
    )   AS PSU
FROM 
    OPERATION
WHERE 
    OPERATION.STATUS = 'R' 
    AND RESOURCE_ID LIKE '%{Root Container.equipmentName}%'

我收到了错误提示,因为子查询生成了多个字段。我需要的是一种方法来为子查询指定条件,只显示与该行中特定工单相关的数据,具体是工单号。我猜这是某种循环函数。
有什么建议吗?
顺便说一句,底线是正确的。我使用的平台将花括号内的值解释为本地变量。

1
请问您能够提供具体的错误信息吗? - Mureinik
数据库=FV_VM)@5000ms 在:FV_Recipe_Page.Root Container.Table.data 由于GatewayException引起:子查询返回的值多于1个。当子查询跟随=,!=,<,<=,>,>=时,不允许这样做,或者当子查询用作表达式时。 由于SQLServerException引起:子查询返回的值多于1个。当子查询跟随=,!=,<,<=,>,>=时,不允许这样做,或者当子查询用作表达式时。Ignition v7.6.6(b2014040112) Java:Oracle Corporation 1.7.0_45 - mreff555
我目前所拥有的条件似乎只能将两个表格中的列链接在一起。仍然会生成大约六个条目。唯一让代码工作的方法是将WORKORDER_BASE_ID与实际数字ID相等。 - mreff555
你的意思是,如果你移除子查询,并将WORKORDER_SUB_ID添加到主查询中,那么你将会得到多个来自于OPERATION的行,对应于单个的WORKORDER_BASE_IDWORKORDER_SUB_ID。现在问题是,它如何决定将哪些记录从REQUIREMENT分配给每个操作? - Gerrat
@HLGEM我不会这么说。在绝大多数情况下,相关子查询都是简单的查询。它们几乎总是会被查询优化器优化为半连接。是的,一般来说最好使用显式连接,但当您尝试仅获取某个人的第一个电话号码时,“TOP 1 ... ORDER BY Priority”通常会非常有效,并且实际上比通常需要跳过的分组最大值更容易阅读。 - Bacon Bits
显示剩余4条评论
1个回答

1
在SELECT语句的子查询中,必须返回一个标量值。在您的SELECT语句中使用TOP 1可以解决该问题。或者您可以采取以下措施...
SELECT OPERATION.WORKORDER_BASE_ID   AS [Work Order]
      ,OPERATION.SCHED_START_DATE    AS [Scheduled Start]
      ,OPERATION.SETUP_HRS           AS [Approx Setup Hrs]
      ,OPERATION.RUN_HRS             AS [Approx Run Hrs]
      ,REQUIREMENT.PART_ID           AS [Components] 
FROM  OPERATION
INNER JOIN REQUIREMENT ON REQUIREMENT.WORKORDER_BASE_ID = OPERATION.WORKORDER_BASE_ID
                      AND REQUIREMENT.WORKORDER_SUB_ID = OPERATION.WORKORDER_SUB_ID
WHERE OPERATION.[STATUS] ='R' 
  AND OPERATION.RESOURCE_ID LIKE '%{Root Container.equipmentName}%'
  AND REQUIREMENT.PART_ID LIKE '%PSU%'

2
连接 qwquery 是好的,但 top 1 是一个可怕的想法,因为你不知道那些多个记录中哪一个有你想要的值。 - HLGEM
1
@HLGEM 是真的,而且它会针对外部查询返回的每一行执行,这在性能方面是绝对灾难性的,这就是为什么我建议使用 INNER JOIN 解决方案。 - M.Ali
嘿,M. Ali,谢谢你的代码,我尝试了一下,但是我得到了不同的消息。,database=FV_VM)@5000ms On: FV_Recipe_Page.Root Container.Table.data caused by GatewayException: Ambiguous column name 'WORKORDER_BASE_ID'. caused by SQLServerException: Ambiguous column name 'WORKORDER_BASE_ID'. 我以前见过这种情况,但不明白为什么我要连接两个列时会出现这种情况。 - mreff555
在你的选择列表中使用两部分名称,WORKORDER_BASE_ID列存在于两个表中,你需要在选择时使用tablename.columnName来告诉SQL服务器从哪个表中选择此列。我已经更新了答案,请看一下。 - M.Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接