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

时间:2018-03-26 19:13:43

标签: sql sql-server-2008 distinct

首先,我知道我应该有一个价值患者ID的主键。为ID转换执行了一个项目,但进展并不顺利。所以现在我需要查找具有不同患者姓名的所有患者ID。有4个不同的DB>包含信息的表。现在我将它们选入Temp DB。因为我实际上需要所有PID在这些DB之间是不同的。我们的应用程序具有保持同步的工具。但是由于一些糟糕的SQL工作,我需要再次同步所有数据。

PID     NAME     
1234    Johnson
1234    Johnson
4567    Jones
4567    Alexander

我正在尝试编写一个查询,该查询将返回Jones和Alexander的PID 4567 + NAME值的结果。

5 个答案:

答案 0 :(得分:0)

SELECT Min(PID), Name FROM [Table] 
GROUP BY Name 
HAVING Count(PID) = 1

答案 1 :(得分:0)

您需要使用自我加入。请试试这个:

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 
)

答案 2 :(得分:-1)

我认为这样做会

recyclerView.scrollToPosition(length-1)

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

答案 3 :(得分:-1)

SELECT PID,NAME      
FROM TABLE
GROUP BY PID,NAME
HAVING COUNT(*) =1

答案 4 :(得分:-1)

根据您使用的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名称非常重要,因为简化计数*或名称将返回多次出现的相同PID到名称组合,而不仅仅是重复。

如果您只想要重复而不是所有组合。使用RowNumber()或其他东西可以帮助您更有效地得到答案。或者您也可以使用一种方法,例如查找不相同记录的存在,如下所示:

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)

根据数据集等,这种方式可以更快地执行。对于像这样的情况,我倾向于远离使用IN的解决方案。