2016-04-27 81 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过滤器只需要在一个地方。那是我的赞美结束的地方。感谢所有帮助..