2012-03-30 45 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個數據庫。這個新數據庫的每個表都是Union和All Union的一個視圖,不同之處在於現在我添加了一個名爲「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

我不在查詢列表中查詢子查詢。在選擇列表中必須有一個。你能否擴展「blabla ...」? – 2012-03-30 20:01:55

+0

它在那裏。我在想這個問題可能在聯接中。每當我找到一個連接或「where」子句時,我都會添加「UnionAll_Empresa」比較,以避免不一致的主鍵,但我錯過了一些東西。 – 2012-03-30 20:06:13

回答

3

Am I doing something Wrong?

這裏是在你的加入條件之一的一個問題:

and T4.UnionAll_Empresa = T4.UnionAll_Empresa 

T4到T4!

+0

它的工作!非常感謝你,我對這個查詢感到很瘋狂。謝謝,以及所有幫助過的人! – 2012-03-30 20:24:29

0

我真的覺得這個問題超出了我,但我會建議我們在數據倉庫項目我正在做的事情。除了我們在每個表上的標準ID主鍵之外,在許多情況下,我們還添加了一個額外的密鑰,我們稱之爲BK(商業密鑰),我們試圖確保它是唯一的。用法與標準ID密鑰有點不同,因爲BK是嵌入了業務相關信息的字符串。我可以看到你使用它有一個'僞'主鍵,也可以告訴你哪個服務器是你檢索的數據行的源。

這可能看起來很蹩腳,但這是我所能想到的。

+0

我處於困境。該數據庫來自SAP系統,擁有超過1000個表。這個查詢來自一位老僱員,用於生成一些報告。現在他們希望爲所有基地生成一份報告,而且他們沒有時間採用DW方法。 所以我所能做到目前爲止是創建一個新的數據庫與這1000個表的視圖,使unnions和添加一個新的collum至少告訴從每個服務器每行是。 我不知道我的邏輯是否正確,但我想只是在所有比較中添加這個新的collum,我可以將這個查詢轉換爲新的數據庫... =/ – 2012-03-30 20:16:19