2013-05-27 42 views
0

我試圖加入兩個表格,但表格中沒有公共元素,但現實生活中的關係很重要。我能夠從兩個表中獲取數據,但它會產生行重複。輸出如下:加入表格會在沒有關係時創建重複,有什麼辦法可以減少行數?

Job Release Date Release Qty Ship Date Qty Shipped 
17760 2/15/13  320   2/14/13  320 
17760 3/18/13  250   2/14/13  320 
17760 4/11/13  180   2/14/13  320 
17760 2/15/13  320   3/13/13  250 
17760 3/18/13  250   3/13/13  250 
17760 4/11/13  180   3/13/13  250 
17760 2/15/13  320   4/08/13  180 
17760 3/18/13  250   4/08/13  180 
17760 4/11/13  180   4/08/13  180 

我的SQL語句如下:

SELECT PD.oqjob AS Job 
, [OR].ordate AS [Release Date] 
, [OR].orrqty AS [Release Qty] 
, PH.opsdte AS [Ship Date] 
, PD.oqaqty AS [Ship Qty] 
FROM 
    dbo.opakh PH 
    LEFT OUTER JOIN dbo.opakd PD 
    ON PH.oppack = PD.oqpack 
    LEFT OUTER JOIN dbo.orels [OR] 
    ON PD.oqord = [OR].orord AND PD.oqolin = [OR].orline 
WHERE 
    PD.oqjob = '17760' 

我想我的輸出看起來像兩個發佈日期帕克日期以下從早期訂購以後。

Job  Release Date Release Qty Ship Date  Qty Shipped 
17760 2/15/13 0:00 320.00  2/14/13 0:00 320.00 
17760 3/18/13 0:00 250.00  3/13/13 0:00 250.00 
17760 4/11/13 0:00 180.00  4/08/13 0:00 180.00 

另外要注意從OR表返回的行這個數字可能被PH表返回的行不同,這是非常重要的。任何一個表都可以有更多的行返回。

有沒有辦法做到這一點?

編輯:我重做我的SQL語句,因此沒有額外的顯示也沒有在目前的任何額外的表或數據

OR表包含三個版本用自己的數量日期每

13年2月15日320
13年3月18日250
13年4月11日180

有三個不同的包裝工(裝運日期)有一個封隔器頭的d分組器明細表分別爲PHPD。我需要'PH'表中的日期和PD表中的數量。加入這兩個表後,它看起來是這樣的:

13年2月14日320
13年3月13日250
13年4月8日180

我再試圖加入PH & PD結果爲OR結果。

+0

對於每個不同的發佈日期,有多種不同的「發貨日期」和「發貨量」,您如何知道在結果中您想要哪些產品? (100.00甚至不在4/11/13的可用值中) –

+0

對不起,我錯誤地複製了數據。這應該是180.儘管發佈數量和發貨量不一定是相同的值。 – Matt

+0

你可以發表表格結構和樣本數據(sqlfiddle.com會很好)嗎?有點難以理解你的問題。順便說一句 - 因爲你在你的WHERE子句中使用了jhead表,所以不需要這些LEFT JOIN中的幾個。 – sgeddes

回答

0

它看起來像你得到一個任何到任何加入,這表明你的查詢不加入正確的唯一鍵。

說實話,沒有足夠的信息來解釋爲什麼會發生這種情況,但考慮到數量和日期(dbo.opakd和dbo.jhead)匹配,關鍵問題似乎與連接到dbo.orels表:

LEFT OUTER JOIN dbo.orels [or] 
    ON pd.oqord = [or].orord AND pd.oqline = [or].orline 
0
SELECT PD.oqjob AS Job 
, [OR].ordate AS [Release Date] 
, [OR].orrqty AS [Release Qty] 
, PH.opsdte AS [Ship Date] 
, PD.oqaqty AS [Ship Qty] 
FROM 
    dbo.opakh PH 
    LEFT OUTER JOIN dbo.opakd PD 
    ON PH.oppack = PD.oqpack 
    LEFT OUTER JOIN dbo.orels [OR] 
    ON PD.oqord = [OR].orord AND PD.oqolin = [OR].orline 
WHERE 
    PD.oqjob = '17760' 
    AND [OR].orrqty = PD.oqaqty 
    ORDER BY [Release Date], [Ship Date] 

貌似加入其中orrqty和oqaqty到會給你想要的結果...

0

有一點很難完全確保我們明白你'之後,這是我嘗試的最佳嘗試。

關鍵是要引入一個ROW_NUMBER()來維護您的排序,並從OR表中獲取DISTINCT記錄。此外,你需要分開你的結果,並使用FULL OUTER JOIN來組合它們 - 我使用了2個公用表表達式來分開。

WITH CTE AS (
    SELECT PD.oqjob AS Job 
    , PH.opsdte AS [Ship Date] 
    , PD.oqaqty AS [Ship Qty] 
    , ROW_NUMBER() OVER (PARTITION BY PD.oqjob ORDER BY PH.opsdte) rn 
    FROM 
    dbo.opakh PH 
    LEFT OUTER JOIN dbo.opakd PD 
     ON PH.oppack = PD.oqpack 
), CTE2 AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY [Release Date]) rn 
    FROM (
    SELECT DISTINCT PD.oqjob AS Job 
    , [OR].ordate AS [Release Date] 
    , [OR].orrqty AS [Release Qty] 
    FROM 
     dbo.opakh PH 
     LEFT OUTER JOIN dbo.opakd PD 
     ON PH.oppack = PD.oqpack 
     LEFT OUTER JOIN dbo.orels [OR] 
     ON PD.oqord = [OR].orord AND PD.oqolin = [OR].orline 
    ) T 
) 
SELECT CTE.Job, [Release Date], [Release Qty], [Ship Date], [Ship Qty] 
FROM CTE 
    FULL OUTER JOIN CTE2 ON CTE.Job = CTE2.Job AND CTE.rn = CTE2.rn 
WHERE CTE.Job = 17760 OR CTE2.Job = 17760 
ORDER BY COALESCE(CTE.rn,1000000), COALESCE(CTE2.rn,1000000) 

我增加了一個額外的記錄在您的OR表以顯示NULL回報爲好。另請注意,在ORDER BY中,我在每個r周圍使用COALESCE。只要確保COALESCE中的任何號碼都不可能被退回。

相關問題