Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接3个表并返回唯一/不同的行_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 联接3个表并返回唯一/不同的行

Sql 联接3个表并返回唯一/不同的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在SQL Server数据库中有3个表。 当我加入这3个表时,我想获取不同/唯一的行 为此,我在SELECT查询之后使用distinct关键字,但它不起作用。 它仍然返回SELECT查询中的重复记录,即ID、Column1、Column2所有记录都是重复的,因为3个表中的1个表中已经存在重复记录 请让我知道如何联接3个表并返回唯一/不同的行。 请回复 编辑:下面是我的当前查询和结果集: 请检查返回的结果。里面有重复的记录 编辑2: 真的很抱歉以上的混乱。请检查此部分: 如果假设联接表中的一个给

我在SQL Server数据库中有3个表。 当我加入这3个表时,我想获取不同/唯一的行

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

请让我知道如何联接3个表并返回唯一/不同的行。 请回复

编辑:下面是我的当前查询和结果集:

请检查返回的结果。里面有重复的记录

编辑2: 真的很抱歉以上的混乱。请检查此部分:

如果假设联接表中的一个给出以下结果集,请暂时忽略黄色文本:

要求:

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

如果有任何RequestID示例:ABC123/BARCODE无示例:B1有操作 =一起保存并提交,则只有操作=提交记录/行应显示在选择查询中。 如果有任何RequestID示例:XYZ678/BARCODE没有示例:B22 操作=保存、提交和重新提交多个一起重新提交等 然后仅操作=多个重新提交中的最新重新提交 记录/行应显示在选择查询中。 如果有任何RequestID示例:GHI987/条形码没有示例:B3有操作 =提交并重新提交多个文件一起重新提交,等等,然后在选择查询中只显示操作=多个重新提交记录/行中的最新重新提交。 如果有任何RequestID示例:PQR902/条形码没有示例:B44 操作=一起提交并重新提交,等等,然后仅操作=重新提交 记录/行应显示在选择查询中。 如果有任何RequestID示例:TTT878/BarcodeNo示例:B5有操作 =单独提交等,则在选择查询中仅显示操作=提交记录/行。 上述etc表示除“保存”、“提交”、“重新提交”以外的其他操作

为了满足上述要求,基于上述要求,我尝试了以下查询:

但这并没有给我预期的结果。
请让我知道我应该在查询中更改什么以获得所需的输出?

您报告显示重复项的原因是因为您的操作列 正在使前两列重复,因为这些代码上有不同的操作。对于多个操作,所有这些操作都会多次显示
如果删除“操作”列,则每个代码只会看到一行,因为它与您要查找的给定数据集不是完全不同的行,所以“不同”不适用于您。相反,您希望对记录进行排名,并且只显示给定requestid/barcodeno组合的最佳结果。在SQL中,您可以使用行编号对它们进行排序,给出最佳记录行编号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;

请发布您的查询检查:您不认为将查询复制和粘贴为文本比发布屏幕截图更容易吗?它们实际上并不重复。如果包含“操作”列,则组合是唯一的。那个专栏呢?我也没看到任何重复的。RequestID、BarcodeNo和Action没有两行是相同的。非常感谢您的回复。我真的很抱歉弄糊涂了。请检查我发布的问题中的编辑2部分。请帮我解决这个问题。请回复谢谢你的回复。我尝试了您的查询,其工作正常,但它还获取了1个操作,而不是保存、提交、重新提交,即取消IPR操作。我只想根据您定义的首选项获取Action=保存、提交、重新提交。请让我知道为什么会这样。请回复如果要从结果中排除操作,请使用WHERE子句。例如,w.action“取消IPR”或w.action在“保存”、“提交”、“重新提交”中的位置。感谢您的回复。使用此条件:其中rn=1,w.在“保存”、“提交”和“重新提交”中的操作,您的查询工作正常。谢谢我很高兴它对你有用。我会在最后一次连接之后将WHERE条件放在subselect中,以便在对记录进行排序之前立即排除记录。没什么区别,可能会快一点,仅此而已。谢谢你的帮助Thorsten Kettner先生:
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;