2010-01-11 24 views
-2

我從舊查詢中創建一個新查詢,並在結果中獲取重複行。我完全不知道爲什麼會發生這種情況?SQL視圖輸出重複行

這裏是一個不會產生重複舊的SQL代碼:

XtraViwStock

SELECT  TOP 100 PERCENT dbo.qexp_detail.in_date AS inDate, RTRIM(dbo.qexp_detail.stock_locn) AS stockLocn, { fn LCASE(RTRIM(dbo.qexp_detail.in_locn)) 
         } AS inLocn, dbo.qin_doc.in_doc_no AS inDoc, RTRIM(dbo.qexp_detail.client_plt_id) AS pltId, dbo.xtraviwItem.cm, dbo.xtraviwItem.vari, 
         dbo.xtraviwItem.pack, dbo.qexp_detail.prod_grp AS pGrp, dbo.qexp_detail.prod_char AS pChar, dbo.xtraviwItem.grd, dbo.xtraviwItem.sizeCount, 
         dbo.xtraviwItem.brand, dbo.xtratblNotifPltId.chrNotifPltId AS notifPltId, dbo.xtraviwItem.ic, dbo.qexp_detail.targ_mkt AS tm, dbo.qexp_detail.farm AS puc, 
         dbo.qexp_detail.ctn_qty AS ctns, CAST(dbo.qexp_detail.ctn_qty AS float)/CAST(dbo.xtraviwCtnsPerPlt_st.cpp AS float) AS plts, 
         dbo.xtraviwCtnsPerPlt_st.cpp, dbo.qexp_detail.plt_base AS base, dbo.xtraviwMessage.msgText AS inDocMsg, dbo.xtratblSpec.intSpecId AS spec1Id, 
         dbo.xtratblSpec.strInstruction AS spec1Instruct, dbo.xtratblSpec.dtmSpecDate AS spec1SpecDate, 
         dbo.xtratblSpecPallet.dtmLoadDate AS spec1LoadDate, dbo.xtratblSpecPallet.strLoadLocn AS spec1LoadLocn, 
         dbo.xtratblSpecPallet.strReceiver AS spec1Rec, dbo.xtratblSpecPallet.strPOD AS spec1Pod, dbo.xtratblSpec2.intSpecId AS spec2Id, 
         dbo.xtratblSpec2.strInstruction AS spec2Instruct, dbo.xtratblSpec2.dtmSpecDate AS spec2SpecDate, 
         dbo.xtratblSpecPallet2.dtmLoadDate AS spec2LoadDate, dbo.xtratblSpecPallet2.strLoadLocn AS spec2LoadLocn, 
         dbo.xtratblSpecPallet2.strReceiver AS spec2Rec, dbo.xtratblSpecPallet2.strPOD AS spec2Pod, dbo.xtraviwItem.org, dbo.qexp_detail.tran_user, 
         dbo.qexp_detail.tran_datetime, 
         dbo.xtratblSupplier.strProperName + ' ' + dbo.xtratblSupplier.strProperSurname + ', ' + dbo.xtratblSupplier.strProperFarms + ', ' + dbo.qexp_detail.supplier 
         AS producer, { fn LCASE(RTRIM(dbo.qin_doc.farm)) } AS packLocn, dbo.xtraviwItem.varietyGroup, dbo.xtraviwItem.brandDesc, dbo.xtraviwItem.kg, 
         dbo.qexp_detail.client_plt_type AS pltHt, dbo.xtraviwItem.hcHt, dbo.xtraviwItem.stdHt, dbo.qexp_detail.build_flag AS buildFlag 
FROM   dbo.xtraviwCurrentSeason INNER JOIN 
         dbo.qexp_detail ON dbo.xtraviwCurrentSeason.season = dbo.qexp_detail.season LEFT OUTER JOIN 
         dbo.qsupplier LEFT OUTER JOIN 
         dbo.xtratblSupplier ON dbo.qsupplier.supplier = dbo.xtratblSupplier.chrSupplier ON dbo.qexp_detail.supplier = dbo.qsupplier.supplier LEFT OUTER JOIN 
         dbo.xtratblSpec2 RIGHT OUTER JOIN 
         dbo.xtratblSpecPallet2 ON dbo.xtratblSpec2.intSpecId = dbo.xtratblSpecPallet2.intSpecId ON 
         dbo.qexp_detail.client_plt_id = dbo.xtratblSpecPallet2.chrPltId AND dbo.qexp_detail.season = dbo.xtratblSpecPallet2.intSeason LEFT OUTER JOIN 
         dbo.xtratblSpec RIGHT OUTER JOIN 
         dbo.xtratblSpecPallet ON dbo.xtratblSpec.intSpecId = dbo.xtratblSpecPallet.intSpecId ON 
         dbo.qexp_detail.client_plt_id = dbo.xtratblSpecPallet.chrPltId AND dbo.qexp_detail.season = dbo.xtratblSpecPallet.intSeason LEFT OUTER JOIN 
         dbo.qfarm ON dbo.qexp_detail.farm = dbo.qfarm.farm LEFT OUTER JOIN 
         dbo.xtraviwMessage RIGHT OUTER JOIN 
         dbo.qin_doc ON dbo.xtraviwMessage.msgNr = dbo.qin_doc.mesg_no ON dbo.qexp_detail.in_load_id = dbo.qin_doc.in_load_id LEFT OUTER JOIN 
         dbo.xtraviwItem ON dbo.qexp_detail.item_code = dbo.xtraviwItem.item LEFT OUTER JOIN 
         dbo.xtratblNotifPltId ON dbo.qexp_detail.season = dbo.xtratblNotifPltId.intSeason AND 
         dbo.qexp_detail.client_plt_id = dbo.xtratblNotifPltId.chrDiparPltId LEFT OUTER JOIN 
         dbo.xtraviwCtnsPerPlt_st ON dbo.qexp_detail.season = dbo.xtraviwCtnsPerPlt_st.cppSeason AND 
         dbo.qexp_detail.season_key = dbo.xtraviwCtnsPerPlt_st.cppCm AND dbo.qexp_detail.client_plt_id = dbo.xtraviwCtnsPerPlt_st.cppPltId 
WHERE  (dbo.qexp_detail.plt_status = 'S') 
ORDER BY dbo.xtraviwItem.cm, dbo.qexp_detail.in_date, RTRIM(dbo.qexp_detail.stock_locn), RTRIM(dbo.qexp_detail.client_plt_id), dbo.qexp_detail.farm 

這裏是創建副本的新版本:

AllStock2010

SELECT  TOP 100 PERCENT dbo.qexp_detail.in_date AS InDate, dbo.qexp_detail.stock_locn AS StockLocn, dbo.qexp_detail.in_locn AS InLocn, 
         dbo.qin_doc.in_doc_no AS InDoc, dbo.qxfer_detail.instruction_no AS TransferInstructNo, dbo.qexp_detail.instruction_no AS LoadInstructNo, 
         dbo.qexp_detail.client_plt_id AS PltID, dbo.xtraviwItem.cm AS CM, dbo.xtraviwItem.vari AS Variety, dbo.xtraviwItem.pack AS Pack, 
         dbo.qexp_detail.prod_grp AS ProdGrp, dbo.qexp_detail.prod_char AS ProdChar, dbo.xtraviwItem.grd AS Grade, 
         dbo.xtraviwItem.sizeCount AS SizeCount, dbo.xtraviwItem.brand AS Brand, dbo.xtraviwItem.ic AS IC, dbo.qexp_detail.targ_mkt AS TM, 
         dbo.qexp_detail.farm AS PUC, dbo.qexp_detail.ctn_qty AS Cartons, CAST(dbo.qexp_detail.ctn_qty AS float)/CAST(dbo.xtraviwCtnsPerPlt_st.cpp AS float) 
         AS Plts, dbo.xtraviwCtnsPerPlt_st.cpp AS CpP, dbo.qexp_detail.plt_base AS PltBase, dbo.xtraviwMessage.msgText AS InDocMsg, 
         dbo.xtraviwItem.org AS Org, dbo.qexp_detail.tran_user, dbo.qexp_detail.tran_datetime, dbo.qexp_detail.supplier AS Producer, 
         dbo.qin_doc.farm AS PackLocn, dbo.qin_detail.pack_date AS PackDate, dbo.xtraviwItem.varietyGroup AS VarietyGroup, 
         dbo.xtraviwItem.brandDesc AS BrandDesc, dbo.xtraviwItem.kg AS Kg, dbo.qexp_detail.client_plt_type AS PltHt, 
         dbo.qexp_detail.build_flag AS BuildFlag, dbo.xtraviwItem.hcHt AS HcHt, dbo.xtraviwItem.stdHt AS StdHt, dbo.qexp_detail.plt_status AS PltStatus 
FROM   dbo.xtraviwItem RIGHT OUTER JOIN 
         mynhardt.CurrentSeason INNER JOIN 
         dbo.qexp_detail ON mynhardt.CurrentSeason.Season = dbo.qexp_detail.season ON 
         dbo.xtraviwItem.item = dbo.qexp_detail.item_code LEFT OUTER JOIN 
         dbo.qxfer_detail ON dbo.qexp_detail.client_plt_id = dbo.qxfer_detail.client_plt_id LEFT OUTER JOIN 
         dbo.qin_detail ON dbo.qexp_detail.client_plt_id = dbo.qin_detail.client_plt_id LEFT OUTER JOIN 
         dbo.xtraviwCtnsPerPlt_st ON dbo.qexp_detail.season = dbo.xtraviwCtnsPerPlt_st.cppSeason AND 
         dbo.qexp_detail.season_key = dbo.xtraviwCtnsPerPlt_st.cppCm AND 
         dbo.qexp_detail.client_plt_id = dbo.xtraviwCtnsPerPlt_st.cppPltId LEFT OUTER JOIN 
         dbo.qin_doc ON dbo.qexp_detail.in_load_id = dbo.qin_doc.in_load_id LEFT OUTER JOIN 
         dbo.xtraviwMessage ON dbo.qin_doc.mesg_no = dbo.xtraviwMessage.msgNr 
WHERE  (dbo.qexp_detail.plt_status = 'S') 
ORDER BY dbo.xtraviwItem.cm, dbo.qexp_detail.in_date, dbo.qexp_detail.stock_locn, dbo.qexp_detail.client_plt_id, dbo.qexp_detail.farm 

希望有人能指出我正確的方向!

+6

如果不知道你的表格模式,這是不可能的。 – 2010-01-11 17:10:28

+6

你不可能是認真的......任何能夠真正閱讀和理解混亂的連接和無意義的列名的人都應該獲得獎章。你應該試着將其簡化爲一個簡單的,可重現的案例(張貼一個schema * might *幫助)。 – Aaronaught 2010-01-11 17:14:02

回答

3

我不認爲任何人都可以爲你解決這個問題。

也許這可能是一個開始:
COUNT(*)替換列在您的新SELECT並開始註釋掉JOIN s,至返回的計數的變化。檢查您剛剛註釋掉的JOIN是否會導致您不期望的重複行,並確保該JOIN的條件是正確的。

1

LEFT /內部聯接與右混合連接 - 除非這些表有一個一對一的關係,你就會有重複

你的「作戰計劃」將是以下幾點:

  1. 您需要爲所有涉及的表及其關係(一對多等)繪製一個模式,並確定哪個表是您的主要來源,哪些表是「查找」表。

  2. 刪除全部的查找表的第一(和它們的字段包括到所得的數據集),然後檢查重複

  3. 開始添加查找表逐一檢查每個重複項。

另外,「TOP 100 PERCENT」實際上是所有結果數據集。