2015-08-20 45 views
-2

我在SQL Server數據庫中有3個表。
我想獲取distinct/unique行當我加入這3個表。加入3個表並返回唯一/不同的行

對此,我正在使用distinct關鍵字後SELECT查詢,但它不工作。
它仍然在SELECT查詢返回重複記錄(即ID, Column1, Column2所有記錄都在重複,因爲重複的記錄在3和表1已存在)

請讓我知道如何加入3個表,並返回unique/distinct行。
請回復

編輯:下面是我當前的查詢與結果集一起:

enter image description here

請檢查返回的結果。它有重複的記錄。

編輯2: 真的很抱歉以上混淆。請查看本節:

如果假設連接表中的一個給了我下面的結果集(忽略黃文現在): enter image description here

要求:

現在,我要選擇記錄在下文中從上面的結果集的格式:

  • 如果任何請求ID(的exaple:ABC123)/ BarcodeNo(例如:B1)具有操作 =保存&一起提交然後只有Action = Submit記錄/行應在SELECT查詢中顯示。
  • 如果任何請求ID(例如:XYZ678)/ BarcodeNo(例如:B22)具有 行動=保存&提交&重新提交(多個重新提交)一起等 然後僅Action = Latest Resubmit(在多個重新提交) 記錄/行應顯示在SELECT查詢。
  • 如果任何請求ID(例如:GHI987)/ BarcodeNo(例如:B3)具有操作 =提交&重新提交(multile重新提交)一起等則僅Action = Latest Resubmit(在多個重新提交)記錄/行應SELECT查詢顯示。
  • 如果任何請求ID(例如:PQR902)/ BarcodeNo(例如:B44)具有 行動=提交&重新提交一起等那麼只有Action = Resubmit 記錄/行應SELECT查詢顯示。
  • 如果有任何RequestID(例如:TTT878)/ BarcodeNo(例如:B5)有動作 =單獨提交等等,那麼只有Action = Submit記錄/行應在SELECT查詢中顯示。

以上「等」手段,操作「保存」等,「提交」,「重新提交」

爲了滿足上述要求(黃色文字,基於上述要求),我想下面的查詢:

Select distinct R.RequestID, R.BarcodeNo, W.Action, W.CreatedDate 
INTO #TempTable 

From [Sunway_AP].[Invoice].[tbl_Request] (NOLOCK) R 
Left Join [Sunway_AP].[Invoice].[tbl_Xml](NOLOCK) X On X.XmlID = R.XmlID 
Left Join [Sunway_AP].[Invoice].[tbl_WorkflowHistory] (NOLOCK) W On W.RequestID = R.RequestID 
order by R.RequestID 

SELECT * FROM 
(
    SELECT distinct * FROM (SELECT distinct *, ROW_NUMBER() OVER(PARTITION BY RequestID ORDER BY CreatedDate desc) RowNumber FROM #TempTable 
    WHERE [Action] = 'Resubmit') AS t 
    WHERE RowNumber = 1 

    UNION ALL 

    SELECT distinct * FROM (SELECT distinct *, ROW_NUMBER() OVER(PARTITION BY RequestID ORDER BY CreatedDate desc) RowNumber FROM #TempTable 
    WHERE [Action] = 'Save' 
    AND RequestID NOT IN (SELECT DISTINCT RequestID FROM #TempTable WHERE [action] = 'Submit') 
    AND RequestID NOT IN (SELECT DISTINCT RequestID FROM #TempTable WHERE [action] = 'Resubmit')) AS t 
    WHERE RowNumber = 1 

    UNION ALL 

    SELECT distinct * FROM (SELECT distinct *, ROW_NUMBER() OVER(PARTITION BY RequestID ORDER BY CreatedDate desc) RowNumber FROM #TempTable 
    WHERE [Action] = 'Submit' 
    AND RequestID NOT IN (SELECT DISTINCT RequestID FROM #TempTable WHERE [action] = 'Resubmit')) AS t 
    WHERE RowNumber = 1 
) AS a 
order by RequestID 

但它並沒有給我預期的結果。 請讓我知道在查詢中我應該更改哪些內容以獲得所需的輸出?

+4

請發表您的查詢 –

+0

檢查:http://stackoverflow.com/questions/14673225/distinct-rows-from-three-tables-using-joins – iJay

+0

你的問題與C#有什麼關係?你使用的是什麼DBMS(MySQL,SQL Server,Postgres,...)? –

回答

0

它與您之後給定的數據集並不是完全不同的行,因此DISTINCT不適用於您。相反,您需要對記錄進行排名,並且只顯示給定requestid/barcodeno組合的「最佳」。在SQL中,您可以使用ROW_NUMBER()對它們進行排名,給出最佳記錄row_number#1,次最佳#2,依此類推。那麼你只保留#1的就是這樣。

在你的情況(與>意爲 「首選」):最近重新提交>早些時候重新提交>提交>保存

select requestid, barcodeno, action, createddate 
from 
(
    select 
    r.requestid, 
    r.barcodeno, 
    w.action, 
    w.createddate, 
    row_number() over 
    (
     partition by requestid, barcodeno 
     order by 
     case w.action 
     when 'Save' then 1 
     when 'Submit' then 2 
     when 'Resubmit' then 3 
     else 0 
     end desc, w.createddate desc 
    ) as rn 
    from tbl_request r 
    join tbl_xml x on x.xmlid = r.xmlid 
    join tbl_workflowhistory w on w.requestid = x.requestid 
) ranked 
where rn = 1; 
+0

謝謝您的回覆。我嘗試了你的查詢和它的工作正常**,但它還獲取了除「保存,提交,重新提交」**之外的另外1個動作,即「取消IPR」動作。我只想根據您定義的偏好獲取Action = Save,Submit,Resubmit。請讓我知道爲什麼會發生這種情況。請回復 – user3196511

+0

如果您想從結果中排除操作,請使用** WHERE **子句。例如。 ('保存','提交','重新提交')中的w.action <>'取消IPR'或'其中w.action'。 –

+0

謝謝你的回覆。使用這個條件:'('保存','提交','重新提交')'你的查詢工作正常。謝謝 – user3196511

0

你彙報演出「重複」的原因是因爲你的行動列 是使被重複前兩列,因爲這些代碼thers不同的動作全部都是多次顯示的,如果你的多重作用
刪除操作列,您將看到每個代碼只有一行

+0

非常感謝您的回覆。我爲這種混亂感到很抱歉。請檢查我發佈的問題中的**編輯2 **部分。請幫我解決這個問題。請回復 – user3196511

相關問題