Sql 如何查询具有不同患者姓名的ID

Sql 如何查询具有不同患者姓名的ID,sql,sql-server-2008,distinct,Sql,Sql Server 2008,Distinct,首先,我知道我应该在患者ID的值上有一个主键。执行了一个项目来进行ID转换,但进展不太顺利。因此,现在我需要找到所有具有不同患者姓名的患者ID。有4个不同的DBs>表包含信息。现在我把它们选进了临时数据库。因为我实际上需要所有的PID在这些DBs中是不同的。我们的应用程序有保持同步的工具。但是由于一些糟糕的SQL工作,我需要再次同步所有数据 PID NAME 1234 Johnson 1234 Johnson 4567 Jones 4567 Alexan

首先,我知道我应该在患者ID的值上有一个主键。执行了一个项目来进行ID转换,但进展不太顺利。因此,现在我需要找到所有具有不同患者姓名的患者ID。有4个不同的DBs>表包含信息。现在我把它们选进了临时数据库。因为我实际上需要所有的PID在这些DBs中是不同的。我们的应用程序有保持同步的工具。但是由于一些糟糕的SQL工作,我需要再次同步所有数据

PID     NAME     
1234    Johnson
1234    Johnson
4567    Jones
4567    Alexander

我正在尝试编写一个查询,该查询将返回琼斯和亚历山大的PID 4567+名称值的结果。

我认为这样就可以了

select p.pid, max(name), min(name), count(*) as cnt 
from p 
group by pid 
having max(name) <> min(name)


您需要使用自联接。请试试这个:

create table #temp
(id int, name varchar(30))

insert into #temp values (1,'johnson')
insert into #temp values (1,'johnson')
insert into #temp values (2,'james')
insert into #temp values (2,'Alex')

SELECT * FROM #temp WHERE id IN (
   SELECT a.id FROM #temp a
   JOIN #temp b on b.id = a.id AND b.name <> a.name 
)

根据您使用的RDBMS系统的不同,有很多方法,其中一些方法比其他方法更优化。但通常这是一个两步操作

1查找具有多个名称的所有PID 2返回关联以获取您正在查找的其余数据

CREATE TABLE #T (
    PID INT
    ,Name VARCHAR(25)
)

INSERT INTO #T (PID,Name) VALUES (1234,'Johnson'),(1234,'Johnson'),(4567,'Jones'),(4567,'Alexander')


SELECT
    t2.*
FROM
    (
       SELECT
          PID
       FROM
          #T t1
       GROUP BY
          PID
       HAVING COUNT(DISTINCT Name) > 1
    ) dupes
    INNER JOIN #T t2
    ON dupes.PID = t2.PID
在使用join或IN等方法时,使用DISTINCT name非常重要,因为简化counting*或name将返回同一PID-to-name组合的多次出现,而不仅仅是重复

如果您只想复制,而不是所有的组合。使用行号或其他东西也可以帮助你更有效地找到答案。或者您也可以使用一种方法,例如查找是否存在不相同的记录,例如:

SELECT DISTINCT t1.PID, t1.Name
FROM
    #T t1
WHERE
    EXISTS (SELECT 1 FROM #t t2 WHERE t1.PID = t2.PID AND t1.Name <> t2.Name)

根据数据集等,这种方法可以更快地为您执行。我倾向于远离在此类情况下使用的解决方案。

您使用的是哪种?SQL只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签—postgresql、oracle、db2、sql server……您期望的结果到底是什么?两排?一行?如果你再加上4567,预期结果是什么,谢尔曼?艾瑞给了我想要的结果。我希望所有结果都是1个患者ID相同,但2个不同的MRN。这与OP的要求相反for@paparazzo,我想它会返回两个名字都是4567?呃,如果只有一个1234呢Johnson@paparazzo正当不确定该任务的目的是什么;呃,如果只有一个1234 Johnson怎么办?如果你要加入,有更好的方法,如果一个给定的id有两个以上的名字,这会起作用吗?是的,这很好!我得到了我所需要的。我很高兴我帮了忙。如果您点击左边的勾号选择正确答案,我将不胜感激。谢谢@Kevin3142我是新来的。。。它还不让我这么做。我试过了!这两种解决方案实际上只针对成对的重复项,而不是多次出现,例如3。第一个将完全分解,第二个将显示3个名称组合。@Matt它可以工作。如果你有更好的答案,那么你可以选择发布答案。将其描述为完全崩溃有点戏剧性。很好的一天。
create table #temp
(id int, name varchar(30))

insert into #temp values (1,'johnson')
insert into #temp values (1,'johnson')
insert into #temp values (2,'james')
insert into #temp values (2,'Alex')

SELECT * FROM #temp WHERE id IN (
   SELECT a.id FROM #temp a
   JOIN #temp b on b.id = a.id AND b.name <> a.name 
)
CREATE TABLE #T (
    PID INT
    ,Name VARCHAR(25)
)

INSERT INTO #T (PID,Name) VALUES (1234,'Johnson'),(1234,'Johnson'),(4567,'Jones'),(4567,'Alexander')


SELECT
    t2.*
FROM
    (
       SELECT
          PID
       FROM
          #T t1
       GROUP BY
          PID
       HAVING COUNT(DISTINCT Name) > 1
    ) dupes
    INNER JOIN #T t2
    ON dupes.PID = t2.PID
SELECT DISTINCT t1.PID, t1.Name
FROM
    #T t1
WHERE
    EXISTS (SELECT 1 FROM #t t2 WHERE t1.PID = t2.PID AND t1.Name <> t2.Name)