【问题标题】:Rewriting an acceptable ADO query重写可接受的 ADO 查询
【发布时间】:2018-01-11 11:29:25
【问题描述】:

我将这段代码放在一起,并在 SSMS 中完美运行。不幸的是,ADO 或 VBA 都不会接受它,因为子查询返回多个项目。我不太确定如何重写它以获得相同的输出。我需要的是pfsO 中与pfsJQ 中也存在sL 中的项目共享相同[JOB_ID] 的前6 个项目。这样做的替代方法是什么?

错误:

描述:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

VBA 代码:

Set conn = New ADODB.Connection
Set cmd = New ADODB.Command
constr = "Provider=sqloledb;data source=1.2.3.4;initial catalog=THECATALOG;user id=THEUSER;password=THEPASSWORD"
conn.Open constr

With cmd
    .ActiveConnection = conn
    .CommandTimeout = 2
    .CommandType = adCmdStoredProc
    .CommandText = "rt_sp_sys_nextOptics"
    Set rst = .execute
End With

If Not rst.EOF = True Then

i = 0

Do While Not rst.EOF
    Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "SerNo")        '[PLC]OrderFulfillment_NextOptics[0].SerialNumber
    eTag.Value = rst(0)
    Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "Stk")        '[PLC]OrderFulfillment_NextOptics[0].Stack
    eTag.Value = rst(1)
    Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "Try")        '[PLC]OrderFulfillment_NextOptics[0].Tray
    eTag.Value = rst(2)
    Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "Psn")        '[PLC]OrderFulfillment_NextOptics[0].Position
    eTag.Value = rst(3)
    Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "XFP")        '[PLC]OrderFulfillment_NextOptics[0].PartIsXFP
    Select Case rst(4)
        Case Is = "XFP"
            eTag.Value = 1
        Case Is <> "XFP"
            eTag.Value = 0
    End Select
    Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "RawPn")        '[PLC]OrderFulfillment_NextOptics[0].SerialNumber
    eTag.Value = rst(5)
    Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "Label")        '[PLC]OrderFulfillment_NextOptics[0].SerialNumber
    eTag.Value = rst(6)
    i = i + 1
    rst.MoveNext

Loop

End If

SQL 代码:

SELECT TOP 6 pfsO.[SERIAL_NUMBER], pfsO.[RACK], pfsO.[TRAY], pfsO.[POSITION], ff.[FORM_FACTOR_DESCRIPTION], pfsJQ.[RAW_PART_NUMBER], pfsJQ.[LABEL] 
FROM [ROBOTICS_OPTICS_MECHUAT].[dbo].[PULL_FROM_STOCK_OPTICS] AS pfsO
LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[PULL_FROM_STOCK_JOB_QUEUE] AS pfsJQ
    ON pfsO.[JOB_ID] = pfsJQ.[JOB_ID]
LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[FORM_FACTOR] as ff
    ON ff.[FORM_FACTOR_ID] = pfsJQ.[FORM_FACTOR_ID]
WHERE pfsJQ.[SELECTED] = 'True'
AND pfsJQ.[COMPLETED] = 'False'
AND pfsO.[COMPLETED] = 'False'
AND EXISTS (
  SELECT sL.[SERIAL_NUMBER] FROM [ROBOTICS_OPTICS_MECHUAT].[dbo].[STORAGE_LOCATIONS] AS sL 
  WHERE sL.[SERIAL_NUMBER] = pfsO.[SERIAL_NUMBER]
)

【问题讨论】:

  • 这在 SSMS 中无法完美运行。如果您在 SSMS 中访问与使用 ADO 或 VBA 相同的数据源,则会收到相同的错误。
  • 显示你的 VBA 代码?
  • 除了 Exists 子句,我没有看到子查询。 Exists 不会抛出该错误。我的猜测是您的 ADO 查询与此不同。
  • 稍微绕道....您有前 6 名,但没有按顺序排列。你甚至不能确定你会得到哪 6 行。
  • @RandyMinder 我添加了 VBA 代码。不确定它会有所帮助,但这就是我在这里的原因:)

标签: sql sql-server vba sql-server-2012 ado


【解决方案1】:

从功能上讲,这应该与带有内部连接的查询相同。试试这个:

SELECT TOP 6 pfsO.[SERIAL_NUMBER], pfsO.[RACK], pfsO.[TRAY], pfsO.[POSITION], ff.[FORM_FACTOR_DESCRIPTION], pfsJQ.[RAW_PART_NUMBER], pfsJQ.[LABEL] 
FROM [ROBOTICS_OPTICS_MECHUAT].[dbo].[PULL_FROM_STOCK_OPTICS] AS pfsO
LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[PULL_FROM_STOCK_JOB_QUEUE] AS pfsJQ
    ON pfsO.[JOB_ID] = pfsJQ.[JOB_ID]
LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[FORM_FACTOR] as ff
    ON ff.[FORM_FACTOR_ID] = pfsJQ.[FORM_FACTOR_ID]
JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[STORAGE_LOCATIONS] AS sL 
                                            ON sL.[SERIAL_NUMBER] = pfsO.[SERIAL_NUMBER]
WHERE pfsJQ.[SELECTED] = 'True'
AND pfsJQ.[COMPLETED] = 'False'
AND pfsO.[COMPLETED] = 'False'

那么你没有子查询,所以它不会给你一个错误。

【讨论】:

  • 我之前尝试加入该表,但它仍然吐出 [STORAGE_LOCATIONS] 表中不存在的光学元件,这就是我求助于子查询的原因。我会再试一次。
  • @Jaberwocky -- 如果你希望它只包含目标表中的那些,你必须使用JOIN 而不是LEFT JOIN。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 2013-08-26
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多