2016-04-27 98 views
0

我有一個查詢無法在Access中工作。我在Access中運行查詢並獲得將SQL Server 2005查詢轉換爲Access 2003查詢

語法錯誤。在查詢表達式中。

這裏有些奇怪的事情發生在這裏,除非錯誤信息應該在句子中間有一段時間,並且沒有開盤報價的結束報價。

這是工作

select 
    CUS_CustomerID, CUS_CorpName, D.LastRevBy AS DeniedBy, 
    D.LastRevDate AS DeniedDate, S.LastRevBy AS ScreenBy, 
    S.LastRevDate AS ScreenDate, S.Comment AS Comments 
from 
    (tblscreening S 
inner join 
    Customer on CUS_CustomerID = S.PartyID) 
inner join 
    tblscreening D on D.partyid = S.partyid 
        and D.screennumber = (select min(screennumber) 
             from tblscreening 
             where partyid = S.partyid 
              and partytype = 'customer' 
              and deniedparty = 1 
             group by partyid, partytype) 
where 
    S.partytype = 'customer' and S.DeniedParty = 1 
    and S.screennumber = (select max(screennumber) 
          from tblscreening 
          where partyid = S.partyID and partytype = 'customer' 
          group by partyid, partytype) 
order by 
    S.partyid 

這裏是一個客戶的一些樣本數據的查詢。該報告實際上會生成來自多個客戶的數據。

PartyID PartyType ScreenNumber DeniedParty LastRevBy LastRevDate    Comment 
794020 Customer 0    0   827   2007-07-12 13:47:45.000 R# 298479 
794020 Customer 1    0   644   2007-08-10 10:48:48.000 RFQ/UPDATED CUSTOMER CARD 
794020 Customer 2    0   827   2008-04-01 09:24:09.000 R# 311494 
794020 Customer 3    0   827   2008-10-21 12:11:59.000 R# 317773 
794020 Customer 4    0   827   2009-06-02 10:59:25.000 R# 324163 
794020 Customer 5    0   644   2010-06-22 16:05:02.000 R-335656 
794020 Customer 6    0   947   2013-02-04 10:45:53.357 New Inquiry (M8815/6-8) 
794020 Customer 7    1   943   2016-04-26 10:07:41.143 Added to denied party 
794020 Customer 8    1   944   2016-04-26 10:08:14.107 Verified denied party 

單個客戶的結果將是(我加了引號partyid以提高可讀性)

794020 ROCOM CORP. '943' 2016-04-26 10:07:41.143 '944' 2016-04-26 10:08:14.107 Verified denied party 

該查詢工作完全在SQL Server中。我嘗試使用設計器來創建自我連接。然後我複製了語法,並提出了這個

SELECT 
    S.PartyID, S.LastRevBy, S.LastRevDate, D.LastRevBy, D.LastRevDate 
FROM 
    tblExDPScreen S, tblExDPScreen AS D 
WHERE 
    D.screennumber = (SELECT MIN(screennumber) 
         FROM tblExDpscreen 
         WHERE D.partyid = partyid 
         AND partytype = 'customer' AND deniedparty = 1 
         GROUP BY partyid, partytype) 
    AND S.screennumber = (SELECT MAX(screennumber) 
          FROM tblscreening 
          WHERE S.partyid = partyID 
          AND partytype = 'customer' 
          GROUP BY partyid, partytype) 
    AND S.partytype = 'customer' 
    AND S.DeniedParty = 1 

但即使這運行,它根本不工作。我現在唯一的選擇是規範化表格。但是這會導致報告長時間處於非操作狀態,而不是我想要的。我想讓報告起作用,然後決定是否值得將工作分解。

有什麼建議嗎?

+0

我不相信你的初始查詢工作是完整的。你有「From(tblscreening S inner join [...]」,我不能找到結尾括號。你試過「[...] FROM(tblexdpscreen S,[...]」放下D表。並不像sql那樣強大..推斷同一張表兩次可能不是它的一杯茶 – WickedFan

+0

@ChristopherD Customer是另一張表 – Joe

+0

@WickedFan我剪切並粘貼了我在管理工作室發佈的查詢,它工作得很好。我沒有使用括號,如果你指的是paraenthesis,那麼你可以很容易地通過計數來確定它們是否匹配。 – Joe

回答

0
SELECT 
    S.PartyID, S.LastRevBy, S.LastRevDate, D.LastRevBy, D.LastRevDate 
FROM 
    tblExDPScreen S 
INNER JOIN tblExDPScreen AS D ON d.screennumber = (SELECT MIN(screennumber) 
         FROM tblExDpscreen 
         WHERE D.partyid = partyid 
         AND partytype = 'customer' AND deniedparty = 1 
         GROUP BY partyid, partytype) 
WHERE S.screennumber = (SELECT MAX(screennumber) 
          FROM tblscreening 
          WHERE S.partyid = partyID 
          AND partytype = 'customer' 
          GROUP BY partyid, partytype) 
    AND S.DeniedParty = 1 

我已經刪除了與partytype的第二個比較。這可能不是最終的答案,但它會接近尾聲。完全刪除表D,看看是否出現錯誤。

+0

當我將連接移除到D並具有正確的行數時,它會運行。也許外部查詢(或查詢defs,不知道什麼Access調用它們)可能工作。 – Joe

0

我終於明白了。 Access可能不支持連接中的子選擇。移動子選擇分離,然後利用這些查詢自聯接

qryScreeningLast查詢:

SELECT 
    MAX(screennumber) AS LastScreenNumber, partyid, partytype 
FROM 
    tblscreening 
GROUP BY 
    partyid, partytype 

和qryScreeningDenied

SELECT 
    MIN(screennumber) AS DeniedScreenNumber, partyid, partytype 
FROM 
    tblscreening 
WHERE 
    deniedparty=1 
GROUP BY 
    partyid, partytype 

最後

SELECT 
    CUS_CustomerID, CUS_CorpName, S.PartyID, S.LastRevBy AS ScreenBy, S.LastRevDate AS ScreenDate, T.LastRevBy AS DeniedBy, T.LastRevDate AS DeniedDate, S.Comment 
FROM 
    tblscreening AS S, qryScreeningLast AS L, qryScreeningDenied AS D, tblscreening AS T, Customer 
WHERE 
    (((Customer.CUS_CustomerID)=[S].[PartyID]) AND ((S.PartyID)=[L].[partyID] 
    AND (S.PartyID)=[D].[partyID]) AND ((S.PartyType)='customer' 
    AND (S.PartyType)=[L].[partytype] AND (S.PartyType)=[D].[partytype]) 
    AND ((S.DeniedParty)=1) AND ((S.ScreenNumber)=[LastScreenNumber]) 
    AND ((T.PartyID)=[D].[partyID]) AND ((T.PartyType)=[D].[partytype]) 
    AND ((T.ScreenNumber)=[DeniedScreenNumber])) 
ORDER BY 
    CUS_CorpName 

雖然我不喜歡多我必須承認的做事情的「訪問方式」我確實喜歡c ustomer過濾器只需要在一個地方。那是我的讚美結束的地方。感謝所有幫助..