2014-09-04 3 views
1

Я - SQL newby, и я борюсь со следующим (упрощенным) запросом.SQL Server: несколько SELECT в одном запросе

Он должен извлечь номер учетной записи из основного файла (Master) и связанных транзакций из текущей таблицы (nTrans) и таблицы истории (nTransArc) с использованием общих полей номера учетной записи. Это прекрасно работает.

Часть, с которой я не могу работать, также необходимо извлечь транзакции Vat из таблиц VatTrans (Current) и VatTransArc (History), используя ссылку между TranCode в таблицах nTrans/nTransArc и VTranCode в Таблицы 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 
+2

Вы можете комбинировать несколько наборов результатов вместе, используя UNION (который будет располагать один поверх другого) или JOIN (который объединит множества рядом). Каким должен быть конечный результат? –

+0

Они должны быть бок о бок, поэтому INNER JOIN, но я не уверен в точном синтаксисе, чтобы сделать эту работу. Я пробовал все варианты, которые я могу придумать в SQL Management Studio, но все они придумывают ошибки (и очень загадочные сообщения об ошибках). –

ответ

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 
+0

Спасибо, Бет. Это сработало отлично. Я пытался проголосовать за вас, но он говорит мне, что «Vote Up требует 15 репутации»? Я не знаю, как создать репутацию. Сожалею. –

+0

Добро пожаловать в SO, чтобы понять точки репутации, проверьте [SO tour] (http://stackoverflow.com/tour) – Beth

+0

Спасибо, Бет. Я вижу, что у меня теперь репутация 10 - спасибо, ребята ... –

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 

Это становится все текущие данные в одном запросе а затем получает все ваши исторические данные во втором запросе и затем объединяет результаты.

+0

Спасибо, Becuzz - я пробовал этот формат, и он также отлично работает. Нажатие кнопки «Голосовать» говорит мне, что «Vote Up требует 15 репутации»? Я не знаю, как создать репутацию. Сожалею. –

0

Я не уверен, какую версию sql вы используете, но это немного читаемо. Кроме того, если вы часто делаете этот вид union all со своими архивными таблицами, вам следует рассмотреть возможность добавления представления.

Смежные вопросы