2011-02-24 101 views
0

我試圖得到運行下面的SQL語句:SQL Server錯誤30​​72:子查詢運行時錯誤

SELECT 
    q1.ORDERID, q1.LINE, q1.HOURS, 
    q1.HOURS/(
     SELECT COUNT(*) FROM Query3 q2 WHERE q2.ORDERID = q1.ORDERID 
    ) 
FROM Query3 q1; 

但查詢導致錯誤3072,描述here

谷歌搜索關於上述錯誤,我認爲這是因爲不同類型之間的比較(或其他我看不到)。所以與查詢玩,我發現下面的查詢可以正常運行:

SELECT 
    q1.ORDERID, q1.LINE, q1.HOURS, 
    q1.HOURS/(
     SELECT COUNT(*) FROM Query3 q2 WHERE q2.ORDERID = "4000" 
    ) 
FROM Query3 q1; 

但下面人不(提高對標題錯誤):

SELECT 
    q1.ORDERID, q1.LINE, q1.HOURS, 
    q1.HOURS/(
     SELECT COUNT(*) FROM Query3 q2 WHERE "4000" = q1.ORDERID 
    ) AS Expr1 
FROM Query3 q1; 

這個建議之前,我嘗試子查詢值轉換的方式如下:

CLng(Nz(q1.HOURS))/
(SELECT COUNT(*) FROM Query3 q2 WHERE CStr(Nz(q2.ORDERID), "")) = CStr(Nz(q2.ORDERID, ""))) 

但我沒有運氣...

ORDERID and LINE有字符串類型; HOUR有整數類型。運行SQL查詢的環境是Access 2007.

Query3從派生自Query1的Query2派生而來。涉及許多表格。我認爲這個問題是由複雜的數據庫結構造成的。我試圖在更簡單的數據庫上執行這些查詢,並且一切正常運行。

什麼會導致該錯誤?


這裏是QUERY3的定義:

SELECT 
    [Qry REQUESTS ALL Authorized].Site, 
    [Qry RDA and ORDERS].[Work Centre] AS [PO Work Center], 
    [Qry RDA and ORDERS].[Work Centre Descr], 
    [Qry RDA and ORDERS].DS_WORK_CENTER_MAIN, 
    [Qry RDA and ORDERS].[ID SHAREPOINT] AS [SHAREPOINT ID], 
    [Qry RDA and ORDERS].[QT Ordinamento] AS [PO QT Ordinam], 
    [Qry RDA and ORDERS].[BUDGET ACTIVITY] AS [PO BDG Activ], 
    [Qry RDA and ORDERS].RDA, 
    [Qry RDA and ORDERS].[RDA Line], 
    [Qry RDA and ORDERS].[PURCHASE ORDER], 
    [Qry RDA and ORDERS].[PO Line], 
    [Qry RDA and ORDERS].RESOURCE AS [PO Resource], 
    [Qry RDA and ORDERS].[EFFECTIVE START DATE], 
    [Qry RDA and ORDERS].[EFFECTIVE FINISH DATE], 
    [Qry RDA and ORDERS].[PO LINE HOURS], 
    [Qry Actual].Booking_Number AS [Act BookNum], 
    Sum([Qry Actual].ACTUAL_HOURS) AS [Act Hours], 
    IIf([PO LINE HOURS] IS NOT NULL,[Remaining],[PO LINE HOURS]-[Remaining]) AS [Remaining Hours], 
    [PO LINE HOURS]-[Act Hours] AS Remaining, 
    [Qry REQUESTS ALL Authorized].Program, 
    [Qry REQUESTS ALL Authorized].[Ord Progr], 
    [Qry REQUESTS ALL Authorized].[Main Program], 
    [Qry REQUESTS ALL Authorized].[Ord Main Progr], 
    [Qry RDA and ORDERS].ORD_WCM, [Qry RDA and ORDERS].ORD_WCS, 
    [Qry RDA and ORDERS].DS_WORK_CENTER_SYSTEM, 
    [Qry REQUESTS ALL Authorized].[Work Centre] AS [Author Work Center], 
    [Qry REQUESTS ALL Authorized].QUARTER, 
    [Qry REQUESTS ALL Authorized].Year, 
    [Qry REQUESTS ALL Authorized].ISSUE, 
    [Qry RDA and ORDERS].Supplier AS [PO Supplier], 
    Sum([Qry RDA and ORDERS].[PO JS]) AS [PO JS], 
    Sum([Qry RDA and ORDERS].[PO WP]) AS [PO WP], 
    [Qry RDA and ORDERS].[PO WP] AS [Work Package], 
    [Qry RDA and ORDERS].[PO JS] AS [Job Shopper], 
    [Qry Actual].BudgetActivity AS Actual_BDG_Act 
FROM 
    [Qry REQUESTS ALL Authorized] LEFT JOIN 
    (
     [Qry RDA and ORDERS] LEFT JOIN [Qry Actual] ON ([Qry RDA and ORDERS].[PURCHASE ORDER] = [Qry Actual].PO_Code) AND ([Qry RDA and ORDERS].[PO Line] = [Qry Actual].PO_Row) 
    ) ON [Qry REQUESTS ALL Authorized].[SHAREPOINT ID] = [Qry RDA and ORDERS].[ID SHAREPOINT] 
GROUP BY 
    [Qry REQUESTS ALL Authorized].Site, 
    [Qry RDA and ORDERS].[Work Centre], 
    [Qry RDA and ORDERS].[Work Centre Descr], 
    [Qry RDA and ORDERS].DS_WORK_CENTER_MAIN, 
    [Qry RDA and ORDERS].[ID SHAREPOINT], 
    [Qry RDA and ORDERS].[QT Ordinamento], 
    [Qry RDA and ORDERS].[BUDGET ACTIVITY], 
    [Qry RDA and ORDERS].RDA, 
    [Qry RDA and ORDERS].[RDA Line], 
    [Qry RDA and ORDERS].[PURCHASE ORDER], 
    [Qry RDA and ORDERS].[PO Line], 
    [Qry RDA and ORDERS].RESOURCE, 
    [Qry RDA and ORDERS].[EFFECTIVE START DATE], 
    [Qry RDA and ORDERS].[EFFECTIVE FINISH DATE], 
    [Qry RDA and ORDERS].[PO LINE HOURS], 
    [Qry Actual].Booking_Number, 
    [Qry REQUESTS ALL Authorized].Program, 
    [Qry REQUESTS ALL Authorized].[Ord Progr], 
    [Qry REQUESTS ALL Authorized].[Main Program], 
    [Qry REQUESTS ALL Authorized].[Ord Main Progr], 
    [Qry RDA and ORDERS].ORD_WCM, 
    [Qry RDA and ORDERS].ORD_WCS, 
    [Qry RDA and ORDERS].DS_WORK_CENTER_SYSTEM, 
    [Qry REQUESTS ALL Authorized].[Work Centre], 
    [Qry REQUESTS ALL Authorized].QUARTER, 
    [Qry REQUESTS ALL Authorized].Year, 
    [Qry REQUESTS ALL Authorized].ISSUE, 
    [Qry RDA and ORDERS].Supplier, 
    [Qry RDA and ORDERS].[PO WP], 
    [Qry RDA and ORDERS].[PO JS], 
    [Qry Actual].BudgetActivity 
HAVING ((([Qry RDA and ORDERS].[Work Centre]) Is Not Null)) 
ORDER BY 
    [Qry REQUESTS ALL Authorized].Site, 
    [Qry RDA and ORDERS].[Work Centre], 
    [Qry RDA and ORDERS].[ID SHAREPOINT]; 

於是,有趣的查詢字段從未來[QRY RDA和訂單] [採購訂單][QRY RDA和訂單。 ]。[PO Line] and [Qry RDA and ORDERS]。[PO line HOURS]

查詢QRY RDA和訂單被定義爲

SELECT 
    ORDINI_RIGHE_ORDINE.[ID SHAREPOINT], 
    ORDINI.CdC AS [Work Centre], 
    Anag_CdC.DESCRIZIONE AS [Work Centre Descr], 
    ORDINI.FORNITORE AS Supplier, 
    ORDINI_RIGHE_ORDINE.RDA, 
    ORDINI_RIGHE_ORDINE.RIGA_RDA AS [RDA Line], 
    ORDINI.[PURCHASE ORDER], 
    ORDINI_RIGHE_ORDINE.[RIGA ORDINE] AS [PO Line], 
    ORDINI_RIGHE_ORDINE.[PO LINE HOURS], 
    Qry_Attivita.[QT Ordinamento], 
    ORDINI_RIGHE_ORDINE.[BUDGET ACTIVITY], 
    [HOURS VALUE EURO]+[HOURS VALUE POUNDS]+[TRAVEL COSTS EURO]+[OTHER COSTS EURO]+[TRAVEL COSTS POUNDS]+[OTHER COSTS POUNDS] AS ORDER_VALUE, 
    [HOURS VALUE EURO]+[HOURS VALUE POUNDS] AS HOURS_VALUE, 
    [TRAVEL COSTS EURO]+[OTHER COSTS EURO]+[TRAVEL COSTS POUNDS]+[OTHER COSTS POUNDS] AS OTHER_COSTS_VALUE, 
    ORDINI_RIGHE_ORDINE.[HOURS VALUE EURO], 
    ORDINI_RIGHE_ORDINE.[TRAVEL COSTS EURO], 
    ORDINI_RIGHE_ORDINE.[OTHER COSTS EURO], 
    [TRAVEL COSTS EURO]+[OTHER COSTS EURO] AS Other_Costs_Euro, 
    ORDINI_RIGHE_ORDINE.[HOURS VALUE POUNDS], 
    ORDINI_RIGHE_ORDINE.[TRAVEL COSTS POUNDS], 
    ORDINI_RIGHE_ORDINE.[OTHER COSTS POUNDS], 
    [TRAVEL COSTS POUNDS]+[OTHER COSTS POUNDS] AS Other_Costs_Pounds, 
    ORDINI_RIGHE_ORDINE.RESOURCE, 
    ORDINI_RIGHE_ORDINE.[EFFECTIVE START DATE], 
    ORDINI_RIGHE_ORDINE.[EFFECTIVE FINISH DATE], 
    ORDINI_RIGHE_ORDINE.[OPEN/CLOSE], 
    ORDINI_RIGHE_ORDINE.NOTES, 
    ORDINI.WORKPACKAGE AS [PO WP], 
    ORDINI.[JOB SHOPPER] AS [PO JS], 
    ORDINI.[RDA CHECKED], 
    ORDINI.[RDA AUTHORISED], 
    ORDINI.[ID RICHIESTA RIGA], 
    Qry_Work_Center.ORD_WCS, 
    Qry_Work_Center.DS_WORK_CENTER_SYSTEM, 
    Qry_Work_Center.ORD_WCM, 
    Qry_Work_Center.DS_WORK_CENTER_MAIN, 
    Qry_Work_Center.Site 
FROM 
    Qry_Work_Center INNER JOIN (
     Anag_CdC INNER JOIN (
      (ORDINI INNER JOIN ORDINI_RIGHE_ORDINE ON ORDINI.RDA = ORDINI_RIGHE_ORDINE.RDA) INNER JOIN Qry_Attivita ON ORDINI_RIGHE_ORDINE.[BUDGET ACTIVITY] = Qry_Attivita.[Budget Activity]) ON Anag_CdC.CDC = ORDINI.CdC 
     ) ON Qry_Work_Center.[Work Centre] = ORDINI.CdC 
GROUP BY 
    ORDINI_RIGHE_ORDINE.[ID SHAREPOINT], 
    ORDINI.CdC, 
    Anag_CdC.DESCRIZIONE, 
    ORDINI.FORNITORE, 
    ORDINI_RIGHE_ORDINE.RDA, 
    ORDINI_RIGHE_ORDINE.RIGA_RDA, 
    ORDINI.[PURCHASE ORDER], 
    ORDINI_RIGHE_ORDINE.[RIGA ORDINE], 
    ORDINI_RIGHE_ORDINE.[PO LINE HOURS], 
    Qry_Attivita.[QT Ordinamento], 
    ORDINI_RIGHE_ORDINE.[BUDGET ACTIVITY], 
    [HOURS VALUE EURO]+[HOURS VALUE POUNDS]+[TRAVEL COSTS EURO]+[OTHER COSTS EURO]+[TRAVEL COSTS POUNDS]+[OTHER COSTS POUNDS], 
    [HOURS VALUE EURO]+[HOURS VALUE POUNDS], 
    [TRAVEL COSTS EURO]+[OTHER COSTS EURO]+[TRAVEL COSTS POUNDS]+[OTHER COSTS POUNDS], ORDINI_RIGHE_ORDINE.[HOURS VALUE EURO], 
    ORDINI_RIGHE_ORDINE.[TRAVEL COSTS EURO], 
    ORDINI_RIGHE_ORDINE.[OTHER COSTS EURO], 
    [TRAVEL COSTS EURO]+[OTHER COSTS EURO], 
    ORDINI_RIGHE_ORDINE.[HOURS VALUE POUNDS], 
    ORDINI_RIGHE_ORDINE.[TRAVEL COSTS POUNDS], 
    ORDINI_RIGHE_ORDINE.[OTHER COSTS POUNDS], 
    [TRAVEL COSTS POUNDS]+[OTHER COSTS POUNDS], 
    ORDINI_RIGHE_ORDINE.RESOURCE, 
    ORDINI_RIGHE_ORDINE.[EFFECTIVE START DATE], 
    ORDINI_RIGHE_ORDINE.[EFFECTIVE FINISH DATE], 
    ORDINI_RIGHE_ORDINE.[OPEN/CLOSE], 
    ORDINI_RIGHE_ORDINE.NOTES, 
    ORDINI.WORKPACKAGE, ORDINI.[JOB SHOPPER], 
    ORDINI.[RDA CHECKED], 
    ORDINI.[RDA AUTHORISED], 
    ORDINI.[ID RICHIESTA RIGA], 
    Qry_Work_Center.ORD_WCS, 
    Qry_Work_Center.DS_WORK_CENTER_SYSTEM, 
    Qry_Work_Center.ORD_WCM, 
    Qry_Work_Center.DS_WORK_CENTER_MAIN, 
    Qry_Work_Center.Site 
ORDER BY 
    ORDINI_RIGHE_ORDINE.[ID SHAREPOINT], 
    ORDINI.CdC; 

所以,源表是ORDINIORDINI RIGHE,其被定義爲字符串類型,允許NULL值。

+0

您是否嘗試驗證ORDERID中的NULL值?嘗試過濾這些值以避免比較NULL。也許你的數據庫損壞了。嘗試壓縮並修復它(工具 - 緊湊和修復)然後重試您的查詢。 – Nico 2011-02-25 02:07:50

+0

使用Nz函數可以避免NULL值,不是嗎?我會試一試。 – Luca 2011-02-25 06:32:03

+0

您的原始查詢通過簡單的測試數據爲我正確運行。我猜這個問題被埋在Query3中(或者甚至可能會進一步下降)。發佈Query3的內容將會很有幫助(事實上,我不知道我們還能如何幫助你)。 – mwolfe02 2011-02-25 14:56:48

回答

0
SELECT q1.ORDERID, 
     q1.LINE, 
     q1.HOURS,  
     CDbl(q1.HOURS)/
      (SELECT COUNT(*) 
       FROM Query3 q2 
       WHERE q2.ORDERID = q1.ORDERID, 0) 
FROM Query3 q1; 

我的假設是,Hours是一個整數&我假設COUNT(*)將返回爲整數。一個整數除以整數將返回一個整數。某些情況下的結果值不能用於整數變量。

例如, 200/9

因此,使用CDbl將小時數轉換爲雙精度值將強制查詢返回Double數據類型的結果。

這有幫助嗎?

+0

號嘆氣。我試過了,但執行查詢時仍然存在錯誤。 COUNT(*)返回一個整數。 – Luca 2011-02-27 13:18:01