2012-03-30 16 views
3

Nun, los geht's.INNER JOIN mit mehreren Tabellen und Tasten

Ich habe 4 Server mit der gleichen Datenbank. Es gibt eine Abfrage, die funktioniert, um Daten aus jedem DB einzeln zu erhalten. Es ist etwas wie das:

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 

Heute haben wir eine neue Datenbank, die alle diese 4 DBs zusammenführt. Jede Tabelle dieser neuen DB ist eine Ansicht mit und Union All, mit dem Unterschied, dass ich jetzt eine neue Spalte namens "UnionAll_Empresa" hinzugefügt habe, um zu wissen von welchem ​​Server diese Zeile kam.

Zum Beispiel:

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; 

Jetzt muss ich wieder die alte Abfrage verwenden, mit diesen neuen „Tabellen“. Das Problem ist, dass die Primärschlüssel jetzt nicht mehr eindeutig sind, da sich 4 Server in derselben Tabelle befinden. Die Lösung wäre also, das Feld "UnionAll_Empresa" (das den Namen des Servers angibt) als Schlüssel zusammen mit den Primärschlüsseln in der Abfrage hinzuzufügen. Die neue Abfrage würde wie folgt sein:

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 

Aber es zeigt einen Fehler:

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

Es stillt mehrere Ergebnisse für einige Primärschlüssel finden, auch wenn ich den Vergleich mit der Spalte „UnionAll_Empresa hinzufügen "(Der Name des ursprünglichen Servers).

Mache ich etwas falsch?

--- Hier ist die vollständige Abfrage

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

Ich sehe keine Unterabfrage in Abfragen aufgelistet. Es muss irgendwo eine in der Auswahlliste sein. Könntest du bitte "blabla ..." erweitern? –

+0

Da ist es. Ich dachte, dass das Problem in den Joins sein könnte. Immer wenn ich einen Join oder eine Where-Klausel finde, füge ich den Comparsion "UnionAll_Empresa" hinzu, um inkonsistente Primärschlüssel zu vermeiden, aber mir fehlt etwas. –

Antwort

3

Am I doing something Wrong?

Hier ist ein Problem in einem Ihrer Joinbedingungen:

and T4.UnionAll_Empresa = T4.UnionAll_Empresa 

T4 bis T4!

+0

Es hat funktioniert! Vielen Dank, ich war verrückt nach dieser Frage. Danke, und alle, die geholfen haben! –

0

ich wirklich das Gefühl, diese Frage ist mir schleierhaft, aber ich werde vorschlagen, etwas, das wir auf einem Data-Warehouse-Projekt tun auf ich arbeite. Zusätzlich zu dem standardmäßigen ID-Primärschlüssel, den wir für jede Tabelle haben, haben wir in einigen Fällen einen zusätzlichen Schlüssel hinzugefügt, den wir BK (Business Key) nennen. Wir stellen sicher, dass dieser Schlüssel einzigartig ist. Die Verwendung unterscheidet sich ein wenig von einem Standard-ID-Schlüssel, da die BK eine Zeichenfolge ist, in die geschäftliche Informationen eingebettet sind. Ich könnte sehen, dass Sie einen Pseudo-Primärschlüssel verwenden, der Ihnen auch sagen könnte, welcher Server die Quelle für die Datenzeile war, die Sie abgerufen haben.

Das mag lahm erscheinen, aber es ist alles, was ich mir vorstellen konnte.

+0

Ich bin in einer schwierigen Situation. Die Datenbank stammt aus einem SAP-System mit mehr als 1000 Tabellen. Und diese Abfrage stammt von einem alten Angestellten, um einige Berichte zu generieren. Jetzt wollen sie einen einzigen Bericht für alle Basen erstellen, und sie haben keine Zeit für einen DW-Ansatz. Also alles, was ich bisher tun konnte, ist eine neue DB mit Ansichten dieser 1000 Tabellen zu erstellen, Unions zu machen und ein neues Collum hinzuzufügen, um zumindest zu sagen, von welchem ​​Server jede Zeile ist. Ich weiß nicht, ob meine Logik korrekt ist, aber ich dachte, dass nur diese neue Collum in allen Comparsions hinzufügen konnte ich diese Abfrage in die neue DB konvertieren ... =/ –