加入3个表并返回唯一/不同的行

时间:2015-08-20 07:27:12

标签: sql sql-server tsql

我在SQL Server数据库中有3个表 当我加入这3个表时,我想获取 distinct/unique 行。

为此,我在distinct查询后使用SELECT关键字,但它不起作用。
它仍会在SELECT查询中返回重复记录(即ID, Column1, Column2所有记录都在重复,因为3个表中的1个表中已存在重复记录)

请告诉我如何加入3个表并返回unique/distinct行 请回复

修改:以下是我当前的查询以及结果集:

enter image description here

请检查返回的结果。它中有重复的记录。

编辑2: 真的很抱歉上面的困惑。请查看此部分:

如果假设其中一个Join表给出了以下结果集(暂时忽略黄色文本): enter image description here

要求:

现在,我想从上面的结果集中选择以下格式的记录:

  • 如果任何RequestID(exaple:ABC123)/ BarcodeNo(例如:B1)有Action =保存&一起提交,然后只有Action = Submit记录/行将显示在SELECT查询中。
  • 如果有任何RequestID(例如:XYZ678)/ BarcodeNo(例如:B22) 行动=保存&提交&重新提交(多次重新提交)等 然后只有Action = Latest Resubmit(多次重新提交) 记录/行应显示在SELECT查询中。
  • 如果任何RequestID(例如:GHI987)/ BarcodeNo(例如:B3)有动作 =提交&重新提交(多重重新提交)等,然后只有Action = Latest Resubmit(在多个重新提交中)记录/行中的数据应显示在SELECT查询中。
  • 如果有任何RequestID(例如:PQR902)/ BarcodeNo(例如:B44) 行动=提交&一起重新提交,然后只有Action = Resubmit 记录/行应显示在SELECT查询中。
  • 如果任何RequestID(例如:TTT878)/ BarcodeNo(例如:B5)有动作 =单独提交等,然后只有Action = Submit记录/行将显示在SELECT查询中。

以上"等"意味着,除了' Save'以外的操作 ,'提交' ,'重新提交'

为了满足上述要求(黄色文本,基于上述要求),我尝试了以下查询:

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

但它没有给我预期的结果。 请让我知道在查询中我应该更改哪些内容以获得所需的输出?

2 个答案:

答案 0 :(得分:0)

您报告的原因显示"重复"是因为你的行动专栏 正在使前两列重复,因为他们对这些代码的不同操作都会多次显示多个动作
如果删除操作列,则每个代码只会看到一行

答案 1 :(得分: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;