【问题标题】:Get Common data from two different table从两个不同的表中获取公共数据
【发布时间】:2014-07-11 09:44:42
【问题描述】:

您好,我有 2 个具有相同列名的表(Id、FName、LName、DOB、Type、Contact、Add)。

现在我想将所有数据作为单独的行获取,这些数据在两个表中具有相同的 FName、LName 和 DOB,按 Fname 的顺序排列。

我尝试使用 intersect 和 Union 但对我不起作用。

  Select * from #t1 where FirstName in (select FirstName from #t2 ) and LastName in  (select LastName from #t2 ) and DateOfBirth in (select DateOfBirth from #t2 ) 
 UNION
Select * from #t2 where FirstName in (select FirstName from #t1 ) and LastName in  (select LastName from #t1 ) and DateOfBirth in (select DateOfBirth from #t1 )      order by FirstName ,LastName

谢谢

【问题讨论】:

  • 为什么不起作用?是什么事情让你这么说?你知道UNION 自己执行GROUP BY 操作,对吧?如果您希望所有行不考虑重复,请使用UNION ALL。
  • 在我的情况下它不起作用,因为它会检查 T2 的所有数据中的 FirstName 以及 Lastname 和 Dob 的相同。
  • 好的,看起来 Nithesh 在我完成打字之前已经提供了合适的答案。但要小心标记多个数据库平台 - 并非所有语法在所有平台上都是通用的(尽管在这种情况下很好)。
  • @Steve Pettifer:仍然没有得到正确的解决方案。请阅读我对 Nilesh 帖子的评论。

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


【解决方案1】:

我认为这样可以,但我相信还有更简洁的方法......

SELECT T1.*
FROM T1
INNER JOIN T2 
    ON T2.FirstName = T1.FirstName
    AND T2.LastName = T1.LastName
    AND T2.DateOfBirth = T1.DateOfBirth
UNION ALL
SELECT T2.*
FROM T2
INNER JOIN T1 
    ON T1.FirstName = T2.FirstName
    AND T1.LastName = T2.LastName
    AND T1.DateOfBirth = T2.DateOfBirth

【讨论】:

  • 不用担心。我确信有一种更紧凑的方法可以做到这一点,我只是想弄清楚那是什么!
【解决方案2】:

试试这个

SELECT T1.Id,
       T1.FName, 
       T1.LName,
       T1.DOB,
       T1.Type,
       T1.Contact,
       T1.Add
FROM #t1 T1 INNER JOIN #t2 T2
   ON  T1.FName=T2.FName
   AND T1.LName=T2.LName
   AND T1.dob=T2.dob

【讨论】:

  • 听起来最接近我认为的 OP 想要的。
  • 如果contact、add等字段数据不同怎么办?
  • 问题说only same FName, LName and DOB 。
  • @user790454:现在你得到了我的问题。你说我想要两行按名字排序的数据
【解决方案3】:

解决此问题的另一种方法是在 union 之后进行聚合。然后检查这些值是否出现了必要的次数:

select firstname, lastname, dob
from ((select firstname, lastname, dob, 't1' as which
       from #t1
      ) union all
      (select firstname, lastname, dob, 't2' as which
       from #t2
      )
     ) t
group by firstname, lastname, dob
having count(distinct which) = 2;

【讨论】:

  • 嗨,这个查询将公共数据显示为一行,但我想从两个表中获取两个公共数据,我的意思是作为两个单独的行与其他列,如类型、联系人和添加。
【解决方案4】:

这会起作用

Select a.*,b.* from #t1 a join #t2 b on (a.FName=b.FName and a.LName=b.LName and a.DOB=b.DOB)

【讨论】:

  • 您好,您使用联接并将两个表中的公共数据合并为行,但我想将此数据作为两行获取
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2021-10-21
  • 2019-05-27
  • 1970-01-01
相关资源
最近更新 更多