SQL(生日相同的员工)

SQL(生日相同的员工),sql,Sql,我有这张桌子: name dob Avash 1991-07-23 Bipin 1990-03-25 Bijay 1990-03-25 如何获取具有相同dob的员工列表?您可以尝试类似的方法 SELECT * FROM table WHERE dob IN ( SELECT dob FROM table HAVING COUNT(dob) > 1 GROUP BY dob ) 子查询查找多次发生的所有dob值,然后您只需选择与这些dob匹配的所有名称

我有这张桌子:

name     dob
Avash   1991-07-23
Bipin   1990-03-25
Bijay   1990-03-25

如何获取具有相同dob的员工列表?

您可以尝试类似的方法

SELECT * FROM table WHERE dob IN (
  SELECT dob
  FROM table
  HAVING COUNT(dob) > 1
  GROUP BY dob
)
子查询查找多次发生的所有dob值,然后您只需选择与这些dob匹配的所有名称。

选择tbl1.name
SELECT  tbl1.name
       ,tbl2.name
FROM    table tbl1
       ,table tbl2
WHERE   tbl1.dob = tbl2.dob
AND     tbl1.name < tbl2.name
,tbl2.name 来自表tbl1 ,表tbl2 其中tbl1.dob=tbl2.dob 和tbl1.name
如果RDBMS中支持窗口功能,也可以选择:

SELECT *
FROM (
   SELECT name, dob, count(*) OVER (PARTITION BY dob) as dobcount
   FROM yourtable
) sub
WHERE sub.dobcount > 1

这将得到与@daniel非常正确的答案类似的答案。

我会这样做

CREATE TABLE #stuff (first_name varchar(15), dob date);

INSERT INTO #stuff (first_name, dob)
VALUES ('Avash', '1991-07-23')
     , ('Bipin', '1990-03-25')
     , ('Bijay', '1990-03-25')
     , ('Mike', '2010-12-01')
     , ('Dick', '2010-12-01')
     , ('Kavitha', '1992-03-25');

SELECT s.[first_name]
     , s.dob
  FROM #stuff s
 WHERE EXISTS (
SELECT dob
  FROM #stuff
 WHERE dob = s.dob
 GROUP BY dob
HAVING COUNT(*) > 1
);
这是你能得到的


您知道基本的SQL语句,如“选择”和“位置”吗?如果不是,我建议您先学习基本的SQL。这样只会得到与其他人生日相同的员工列表,但不会得到与其他人生日相同的员工的姓名。@mypetlion这是错误的。其他人将出现在后续记录中。我认为一个订单是合适的,这样就很清楚了。@jnevil是的,他们会在结果的其他地方。但是我不认为在结果中记录没有配对有什么用处。你的想法是“配对”,但可能有100人共享这个生日。试图在列中显示这一点是不合适的。只为name分配两列仍然会导致您必须按行搜索匹配项。@my呈请如果您查看我作为答案添加的窗口函数版本,您会看到它也会显示共享同一生日的人数,这在搜索重复项时也会非常有帮助。你可以按dobcount下单,看看他们要处理的是什么样的大混乱(假设我们正在搜索重复的数据清理,但可能不是在OPs情况下,因为DOB会变成一个哑键,除非该表类似于“当天的事实”之类的东西)。这意味着两个名为John且具有相同bday的人不会返回。这也意味着如果三个人具有相同的dob,则最终将得到一些奇怪的半笛卡尔积。该表只有两列。如果它们具有相同的名称和相同的生日,则无法区分它们,而且实际上是一个重复的行。在该测试中使用表的主键。从问题中显示的示例来看,名称似乎是PK。我通常使用