2012-03-30 13 views
3

まあ、始めることができます。複数のテーブルとキーを持つINNER JOIN

私は同じデータベースを持つ4つのサーバーを持っています。各DBから個別にデータを取得するために正常に動作するクエリがあります。このようなその何か:

SELECT "blablablablabla" 
FROM [UNION_ALL_BASES]..OVPM T01 with (nolock) 
INNER JOIN [UNION_ALL_BASES]..VPM2 T11 with (nolock) ON T01.UnionAll_Empresa = T11.UnionAll_Empresa and T01.DocEntry = T11.DocNum 
INNER JOIN [UNION_ALL_BASES]..PCH6 T2 with (nolock) ON T11.UnionAll_Empresa = T2.UnionAll_Empresa and T11.DocEntry = T2.DocEntry and T11.InstId = T2.InstlmntID 
INNER JOIN [UNION_ALL_BASES]..OPCH T3 with (nolock) ON T2.UnionAll_Empresa = T3.UnionAll_Empresa and T2.DocEntry = T3.DocEntry 
INNER JOIN [UNION_ALL_BASES]..PCH1 T3a with (nolock) ON T3.UnionAll_Empresa = T3a.UnionAll_Empresa and T3.DocEntry = T3a.DocEntry 
LEFT JOIN [UNION_ALL_BASES]..OOCR T3b with (nolock) ON T3a.UnionAll_Empresa = T3b.UnionAll_Empresa and T3a.OcrCode2 = T3b.OcrCode 
INNER JOIN [UNION_ALL_BASES]..OSLP T4 with (nolock) ON T4.UnionAll_Empresa = T4.UnionAll_Empresa and T3.SlpCode = T4.SlpCode 
and T11.InvType = ''18'' 
AND T01.Canceled <> ''Y'' 
AND T01.CashSum > 0 

今日、我々は、これらすべての4つのDBをマージして1つの新しいデータベースを持っています。この新しいDBの各テーブルは、Union Allを持つビューで、この行がどのサーバから来たのかを知るために、 "UnionAll_Empresa"という名前の新しいカラムを追加した点が異なります。例えば

CREATE VIEW AACP as 
SELECT 'G8Networks Solucoes' as UnionAll_Empresa, * from SBO_G8NETWORKS_SOLUCOES.dbo.AACP 
UNION All 
SELECT 'G8Networks NIC' as UnionAll_Empresa, * from SBO_G8NETWORKS_NIC.dbo.AACP 
UNION All 
SELECT 'SPIN' as UnionAll_Empresa, * from SBO_SPIN.dbo.AACP 
UNION All 
SELECT 'FA2R' as UnionAll_Empresa, * from SBO_FA2R.dbo.AACP; 

は、今私は、これらの新しい「テーブル」で、再びその古いクエリを使用する必要があります。問題は、同じテーブルに4つのサーバーが存在するため、プライマリキーがもう一意ではないことです。したがって、解決策は、 "UnionAll_Empresa"フィールド(サーバーの名前を伝える)をキーとしてクエリーの主キーとともに追加することです。新しいクエリは、このようなものになるだろう:

SELECT "blalalalalala" 
FROM [UNION_ALL_BASES]..OVPM T01 with (nolock) 
INNER JOIN [UNION_ALL_BASES]..VPM2 T11 with (nolock) ON T01.DocEntry = T11.DocNum and T01.UnionAll_Empresa = T11.UnionAll_Empresa 
INNER JOIN [UNION_ALL_BASES]..PCH6 T2 with (nolock) ON T11.DocEntry = T2.DocEntry and T11.InstId = T2.InstlmntID and T11.UnionAll_Empresa = T2.UnionAll_Empresa 
INNER JOIN [UNION_ALL_BASES]..OPCH T3 with (nolock) ON T2.DocEntry = T3.DocEntry and T2.UnionAll_Empresa = T3.UnionAll_Empresa 
INNER JOIN [UNION_ALL_BASES]..PCH1 T3a with (nolock) ON T3.DocEntry = T3a.DocEntry and T3.UnionAll_Empresa = T3a.UnionAll_Empresa 
LEFT JOIN [UNION_ALL_BASES]..OOCR T3b with (nolock) ON T3a.OcrCode2 = T3b.OcrCode and T3a.UnionAll_Empresa = T3b.UnionAll_Empresa 
INNER JOIN [UNION_ALL_BASES]..OSLP T4 with (nolock) ON T3.SlpCode = T4.SlpCode and T4.UnionAll_Empresa = T4.UnionAll_Empresa 
WHERE T11.InvType = ''18'' 
AND T01.Canceled <> ''Y'' 
AND T01.CashSum > 0 

しかし、それはエラーを示しています

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

それは私がコラム「UnionAll_Empresaとの比較を追加する場合でも、いくつかの主キーの複数の結果を見つけるスティルス"(元のサーバーの名前)。

何か間違っていますか?

---ここでは、完全なクエリ

set @vQuery = ' 
SELECT --Pagametos de NF em dinheiro 
T01.UnionAll_Empresa, 
Base = ''' + @database + ''', 
NomeEmp = (select a.CompnyName from [UNION_ALL_BASES]..OADM a with (nolock)), 
CNPJ = (select a.TaxIdNum from [UNION_ALL_BASES]..oadm a with (nolock)), 
IE = (Select TaxIdNum2 from [UNION_ALL_BASES]..OADM with (nolock)), 
Filial = (Select PrintHeadr from [UNION_ALL_BASES]..OADM with (nolock)), 
Proj = isnull(T3.Project,''''), 
OcrCode2 = isnull(T3a.OcrCode2,''0''), 
OcrName = isnull(T3b.OcrName,''Sem projeto definido''), 
''NF'' TipoDoc, 
''DIN'' Tipo, 
T01.CardCode, 
T01.CardName, 
CardFName = (select CardFName from [UNION_ALL_BASES]..OCRD with (nolock) where OCRD.CardCode = T01.CardCode and OCRD.UnionAll_Empresa = T01.UnionAll_Empresa), 
T01.DocEntry CodigoBaixaPagamento, 
T11.DocEntry NumeroSapDocumento, 
T01.DocDate DataDocBaixa, 
T3.DocDate, 
T11.InstId Parcela, 
'''' SituacaoParc, 
''1900-01-01'' DataUltBaixa, 
T11.InvType, 
T2.InsTotal ValorDaParcelaOriginal, 
T01.DocDate DataLancamentoBaixa, 
T2.DueDate VencimentoOriginalParcela, 
T3.SeqCode, 
SerieNF = (select SeqName from [UNION_ALL_BASES]..NFN1 with (nolock) where SeqCode = T3.SeqCode and UnionAll_Empresa = T3.UnionAll_Empresa), 
T3.Series, 
T3.Serial, 
T3.SlpCode, 
T4.SlpName, 
round((T3a.LineTotal/T3.DocTotal)*(T11.SumApplied/T01.DocTotal)*(T01.CashSum),2) ValorPago, 
T01.DocTotal TotalBaixa, 
T01.CashSum TotalDinBaixa, 
T01.TrsfrSum TotalTransfBaixa, 
T01.[CheckSum] TotalCHBaixa, 
T01.BoeSum TotalBoeBaixa, 
T01.CreditSum TotalCCredBaixa, 
Case 
When T01.CashSum > 0 Then ''Dinheiro'' 
When T01.TrsFrSum > 0 Then ''Transferência'' 
When T01.CreditSum > 0 Then ''Cartao'' 
End TipoDocumento, 
'''' NossoNumBol, 
'''' DigNossoNumBol, 
''1900-01-01'' VencBoleto, 
'''' CodBancoBol, 
'''' NomeBancoBol, 
0 VlrTotBol, 
'''' NomeFPagtoBol, 
'''' LinhaDigBol, 
'''' TrsfrRef, 
'''' NumCH, 
'''' DataCH, 
'''' StatusCH, 
0 VlrTotCH, 
'''' BancoCH, 
'''' AgenciaCH, 
'''' ContaCH, 
'''' BoeStatus, 
'''' CodCCred, 
'''' NomeCCred, 
'''' NumComprCartao, 
0 NumParcCartao, 
''1900-01-01'' PrimVencimentoCartao, 
0 VlrTotCartao, 
VlrDin = round((T3a.LineTotal/T3.DocTotal)*(T11.SumApplied/T01.DocTotal) * T01.CashSum,2), 
VlrTransf = 0, 
VlrCredit = 0, 
VlrBol = 0, 
VlrCH = 0, 
VlrCart = 0, 
VlrDev = 0, 
VlrBLI = 0 
FROM [UNION_ALL_BASES]..OVPM T01 with (nolock) 
INNER JOIN [UNION_ALL_BASES]..VPM2 T11 with (nolock) ON T01.DocEntry = T11.DocNum and T01.UnionAll_Empresa = T11.UnionAll_Empresa 
INNER JOIN [UNION_ALL_BASES]..PCH6 T2 with (nolock) ON T11.DocEntry = T2.DocEntry and T11.InstId = T2.InstlmntID and T11.UnionAll_Empresa = T2.UnionAll_Empresa 
INNER JOIN [UNION_ALL_BASES]..OPCH T3 with (nolock) ON T2.DocEntry = T3.DocEntry and T2.UnionAll_Empresa = T3.UnionAll_Empresa 
INNER JOIN [UNION_ALL_BASES]..PCH1 T3a with (nolock) ON T3.DocEntry = T3a.DocEntry and T3.UnionAll_Empresa = T3a.UnionAll_Empresa 
LEFT JOIN [UNION_ALL_BASES]..OOCR T3b with (nolock) ON T3a.OcrCode2 = T3b.OcrCode and T3a.UnionAll_Empresa = T3b.UnionAll_Empresa 
INNER JOIN [UNION_ALL_BASES]..OSLP T4 with (nolock) ON T3.SlpCode = T4.SlpCode and T4.UnionAll_Empresa = T4.UnionAll_Empresa 
WHERE T11.InvType = ''18'' 
AND T01.Canceled <> ''Y'' 
AND T01.CashSum > 0 
' 
exec ('insert into #RelContasPagar ' + @vQuery) 
+0

リストされたクエリにサブクエリはありません。選択リストにはどこかに1つある必要があります。 「blabla ...」を展開してください。 –

+0

あります。私は問題が結合にあると考えていました。私がジョインまたは "where"節を見つけたら、不一致のプライマリキーを避けるために "UnionAll_Empresa"コンパイルを追加しますが、何か不足しています。 –

答えて

3

Am I doing something Wrong?

ここにあなたの参加条件の一つで問題です!

+0

これは機能しました!ありがとう、私はこの質問に夢中になりました。ありがとう、そして助けてくれた皆さん! –

0

である私は本当にこの質問は私を超えている感じが、私たちは、私が働いているデータ・ウェアハウス・プロジェクトでやっている何かを提案します。各テーブルにある標準IDの主キーに加えて、多くの場合、私たちが一意であることを保証しようとするBK(ビジネスキー)と呼ばれる追加のキーを追加しました。 BKはビジネス関連の情報が埋め込まれた文字列なので、使用法は標準のIDキーとは少し異なります。私はあなたがそれを使ってあなたが検索したデータの行のためのソースとなったサーバーを教えてくれる「疑似」主キーを持っているのを見ることができました。

これは不自然なように見えるかもしれませんが、それは私が思いつくことができるすべてです。 T4へ

and T4.UnionAll_Empresa = T4.UnionAll_Empresa 

T4:

+0

私は難しい状況です。データベースは、1000を超えるテーブルを持つSAPシステムからのものです。そして、このクエリは古い従業員のもので、いくつかのレポートを生成するために使用されます。現在、彼らはすべての拠点について単一のレポートを生成したいと考えており、DWアプローチの時間はありません。 これまでにできたのは、これらの1000個のテーブルのビューを持つ新しいDBを作成し、不具合を修正し、少なくとも各ローがどのサーバかを知るために新しいcollumを追加することでした。 私のロジックが正しいかどうかは分かりませんが、この新しいcollumをすべてのcomparsionsに追加すると、このクエリを新しいDBに変換できます。=/ –