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