SQL Server:单个查询中的多个SELECT

时间:2014-09-04 14:39:49

标签: sql sql-server

我是一个SQL newby,我正在努力应对以下(简化)查询。

它必须使用公共帐号字段从主文件(主)和当前表(nTrans)和历史表(nTransArc)中的关联事务中提取帐号。这很好。

我无法工作的部分是它还需要使用nTrans / nTransArc表中的TranCode和VTranCode之间的链接从VatTrans(Current)和VatTransArc(History)表中提取Vat事务。 VatTrans / VatTransArc表。这是行之间的红色代码(以及后来的INNER JOIN)。

有人可以帮忙吗?

SELECT Mast.MAccNo,
    Tran.TAccNo,Tran.TranCode,
    Vat.VTranCode,Vat.TaxCode
FROM (SELECT AccNo,TranCode FROM nTrans 
    UNION ALL SELECT AccNo,TranCode FROM nTransArc)
'-------------------------------------------------------'
FROM (SELECT VTranCode,TaxCode FROM VatTrans 
    UNION ALL SELECT VTranCode,TaxCode FROM VatTransArc)
'-------------------------------------------------------'
Tran JOIN Master Mast ON Tran.TAccNo = Mast.MAccNo 
    INNER JOIN Vat ON Vat.VTranCode = Tran.TranCode
ORDER BY Mast.MAccNo

3 个答案:

答案 0 :(得分:1)

我最好的猜测:

SELECT 
    m.MAccNo,
    t.TranCode,
    v.TaxCode,
    vt.taxcode
FROM 
    Master m inner JOIN
    (SELECT 
        AccNo,TranCode 
    FROM 
        nTrans 
    UNION ALL 
    SELECT 
        AccNo,TranCode 
    FROM 
        nTransArc) t ON 
    m.MAccNo = t.TAccNo   INNER JOIN 
    (select
        TaxCode,
        VTranCode
    from
        Vat 
    union all
    SELECT 
        TaxCode,
        VTranCode        
    FROM 
        VatTrans 
    UNION ALL 
    SELECT 
        TaxCode,
        VTranCode 
    FROM 
        VatTransArc) v ON 
    v.VTranCode = t.TranCode
ORDER BY 
    m.MAccNo

答案 1 :(得分:1)

当我阅读你的问题时,我相信以下内容可以帮助你:

SELECT m.MAccNo
    , t.TAccNo
    , t.TranCode
    , v.VTranCode
    , v.TaxCode
FROM Master m
INNER JOIN nTrans t ON t.TAccNo = m.MAccNo 
INNER JOIN VatTrans v ON v.VTranCode = t.TranCode

UNION ALL 

SELECT m.MAccNo
    , t.TAccNo
    , t.TranCode
    , v.VTranCode
    , v.TaxCode
FROM Master m
INNER JOIN nTransArc t ON t.TAccNo = m.MAccNo 
INNER JOIN VatTransArc v ON v.VTranCode = t.TranCode

ORDER BY m.MAccNo

这会在一个查询中获取所有当前数据,然后在第二个查询中获取所有历史数据,然后合并结果。

答案 2 :(得分:0)

我不确定你使用的是什么版本的sql,但这更具可读性。此外,如果您经常对归档表执行此类union all,则应考虑添加视图。

; WITH Trans AS (
    SELECT AccNo,TranCode
    FROM nTrans 
    UNION ALL
    SELECT AccNo,TranCode
    FROM nTransArc
), WITH Vats AS (
    SELECT TaxCode,VTranCode
    FROM Vat 
    union all
    SELECT TaxCode,VTranCode        
    FROM VatTrans 
    UNION ALL 
    SELECT TaxCode,VTranCode 
    FROM VatTransArc
)

SELECT 
    m.MAccNo,
    t.TranCode,
    v.TaxCode,
    vt.taxcode
FROM Master m 
INNER JOIN Trans t 
    ON m.MAccNo = t.TAccNo
INNER JOIN Vats v ON 
    v.VTranCode = t.TranCode
ORDER BY m.MAccNo