Ms查询无法正常工作。请建议

时间:2013-02-26 16:49:04

标签: ms-access access-vba

enter image description here enter image description here以下查询需要帮助。感谢

SELECT b.SchemeCode_Db,
    'DBELE',
    1,
    SecurityCode_Db,
    "DIRECT",
    Qty,
    Price,
    ((Commission + TransferCharge) / Qty) AS Charges,
    "",
    iif(Buy_sell_code = "1110", 
            ((Qty * Price) + Commission + TransferCharge),
            iif(Buy_sell_code = "1120", ((Qty * Price) - Commission 
                    - TransferCharge
                ))) AS totalCost,
    BrokerCode_Db,
    "",
    Deal,
    Format(Tradedate, "dd/MM/yyyy"),
    Format(Valuedate, "dd/MM/yyyy"),
    '', 'BSE', 'CH', 'D', '',
    iif(Buy_sell_code = "1110", 
            'PUR', 
            iif(Buy_sell_code = "1120", 'SAL')) AS txn,
    'USD' AS cur
FROM tbl_EQUITYINPUT a
LEFT JOIN tbl_EQUITYMapping b
    ON FundCode = SchemeCode_Client
LEFT JOIN tbl_EQUITYMapping c
    ON Ticker = SecurityCode_Client
LEFT JOIN tbl_EQUITYMapping d
    ON Broker = Brokercode_Client

2 个答案:

答案 0 :(得分:1)

当您的查询包含多个FROM时,Access数据库引擎需要JOIN子句中的括号。我怀疑这个FROM子句版本将更接近数据库引擎将接受的东西。

FROM
    ((tbl_EQUITYINPUT a
    LEFT JOIN tbl_EQUITYMapping b
        ON FundCode = SchemeCode_Client)
    LEFT JOIN tbl_EQUITYMapping c
        ON Ticker = SecurityCode_Client)
    LEFT JOIN tbl_EQUITYMapping d
        ON Broker = Brokercode_Client

但是,我不确定db引擎是否会混淆整理哪个连接字段来自哪个表源。我会在这些字段名称前加上正确的表别名。

但我认为,您最直接的欢乐途径可能是从查询设计器中的设计视图中的新查询开始。添加tbl_EQUITYINPUT和3份tbl_EQUITYMapping并分配别名。然后在设计视图中设置它们之间的连接。查询设计器了解保持引擎满意的连接规则,因此将指导您使用正确的连接语法。它还将在连接中包含带有字段名称的别名。

答案 1 :(得分:0)

我想知道是否因为加入哪个tbl_EQUITYMapping实例而感到困惑。

我希望看到你的块看起来更像这样:

select *
FROM tbl_EQUITYINPUT a
LEFT JOIN tbl_EQUITYMapping b
ON a.FundCode = b.SchemeCode_Client
LEFT JOIN tbl_EQUITYMapping c
ON a.Ticker = c.SecurityCode_Client
LEFT JOIN tbl_EQUITYMapping d
ON a.Broker = d.Brokercode_Client

在这种情况下,您将使用tbl_EQUITYINPUT连接三个不同的tbl_EQUITYMapping副本。但我不认为这就是你想要做的。如果您从tbl_EQUITYMapping中提取数据,则select将不知道从哪个副本中提取数据。

我希望SchemeCode_Client,SecurityCode_Client和Brokercode_Client构成tbl_EQUITYMapping的复合键。在这种情况下,我希望看起来像这样的块。

select *
FROM tbl_EQUITYINPUT a
LEFT JOIN tbl_EQUITYMapping b
ON (a.FundCode = b.SchemeCode_Client 
        AND a.Ticker = b.SecurityCode_Client
        AND a.Broker = B.Brokercode_Client)

在这种情况下,您只能获得一份tbl_EQUITYMapping

你可以做同样的事情:

select *
from tbl_EQUITYINPUT a, 
        tbl_EQUITYMapping b
where 
    (a.FundCode = b.SchemeCode_Client 
        AND a.Ticker = b.SecurityCode_Client
        AND a.Broker = B.Brokercode_Client)

(设计师可能会或可能不会在之前的版本中为您优化)