【问题标题】:SQL Server : Compare One Row with Multiple Rows of Same TableSQL Server:比较同一表的一行与多行
【发布时间】:2015-01-30 07:19:47
【问题描述】:

我有如下数据:

id       docid     fname      lname 
1        1         x          y
2        1         x          y
3        1         x          y

我需要具有匹配行的相同文档 ID 的结果 docid 1 的条件同时我想将 id 3 与 id 2 和 1 进行比较并仅获取匹配的记录,但不适用于 id 3。类似的东西:

id       docid      fname     lname
1        1         x          y
2        1         x          y

对我来说好消息是仅与单个 documentid 进行比较,例如 1。另外,我有比较记录。说 id:3,它必须与其他两条记录进行比较。

下面有两种情况,考虑比较id为6:

id       docid     fname      lname 
4        2         p          q
5        2         r          s
6        2         p          q

id       docid     fname     lname
4        2         p          q

如果没有记录匹配,则结果为空。

我尝试了以下方法:

SELECT ta.id,ta.docid,ta.fname,ta.lname FROM tbldoc ta 
      WHERE (SELECT COUNT(*)FROM tbldoc ta2 
           WHERE ISNULL(ta.id,'') = ISNULL(ta2.id,'') AND
                 ISNULL(ta.docid,'') = ISNULL(ta2.docid,'') AND
                 ISNULL(ta.fname,'') = ISNULL(ta2.fname ,'') AND
                 ISNULL(ta.lname,'') = ISNULL(ta2.lname ,'')
            )>1 AND docid=1 And id<>3 

但是,当所有列都有空值时,它会失败。

更新:上面是示例 这是我的真实场景表架构和数据

create table tbldoc (Created int,Checkn nvarchar(max),Account nvarchar(max),EONumber nvarchar(max),Voucher nvarchar(max),Invoice nvarchar(max),Total decimal,Venue nvarchar(max),Reference nvarchar(max),Sign bit,Room nvarchar(max),Page int);
insert into tbldoc values(59,1234,NULL,NULL,NULL,NULL,40,3,NULL,1,NULL,NULL);
insert into tbldoc values(62,1234,NULL,NULL,NULL,NULL,40,3,NULL,1,NULL,NULL);
insert into tbldoc values(68,1234,NULL,NULL,NULL,NULL,40,3,NULL,1,NULL,NULL);

【问题讨论】:

  • 你尝试过什么吗?请发布您的代码。
  • 编辑您的问题并将您的代码添加到您的问题中。

标签: sql sql-server sql-server-2008


【解决方案1】:

试试这个:

select a.* from tbldoc as a right join
(select * from tbldoc where id = 3) as b
on a.docid = b.docid
and a.fname = b.fname
and a.lname = b.lname
and a.id != b.id

您在第二行 (select * from tbldoc where id = 3) as b 中定义条件

select a.* 
from tbldoc as a right join tbldoc as b
on a.docid = b.docid
and a.fname = b.fname
and a.lname = b.lname
and a.id != b.id
where b.id = 3

您在最后一行 where id = 3 中定义条件

--编辑--

这是给你的真实桌子的:

select a.* 
from tbldoc as a right join tbldoc as b
on (a.checkn = b.checkn or b.checkn is NULL)
and (a.Account = b.Account or b.Account is NULL) 
and (a.EONumber = b.EONumber or b.EONumber is NULL) 
and (a.Invoice = b.Invoice or b.Invoice is NULL) 
and (a.Total = b.Total or b.Total is NULL) 
and (a.Venue = b.Venue or b.Venue is NULL) 
and (a.Reference = b.Reference or b.Reference is NULL) 
and (a.Sign = b.Sign or b.Sign is NULL) 
and (a.Room = b.Room or b.Room is NULL) 
and (a.Page = b.Page or b.Page is NULL) 
and a.created != b.created
where b.created = 68

【讨论】:

  • 请告诉我docid怎么样。
  • 我必须比较 docid =1 和 id =3 与其他 id 1 和 2 的 docid =1
  • 你试过查询吗?它会给你完全像你的例子和你在问题中的解释-如果我没弄错的话
  • 当我尝试了两个查询(没有 docid)然后它显示的记录等于 b 中的行数但所有为​​空。我必须获取所有特定 docid 的记录,所以我已将其带到临时表并尝试使用上述查询,但它不起作用
  • 在你的问题中你的桌子真的不一样!!!将您的问题更新为真实表格和示例!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多