我正在使用Oracle SQL Developer
我有一张带有字段名称和电话号码的病人表。 我想只显示与至少其他人有相同号码的人的姓名。
所以患者表是这样的:
create table PATIENT(
name varchar2(9) primary key,
phoneNumber varchar2(15) null
);
所以我尝试了下面的内容:
select name, phoneNumber
from PATIENT
where phoneNumber in(select phoneNumber
from PATIENT
where name not .....);
所以在点的位置应该在父select语句中引用name。 无论如何要做到这一点,还是有完全不同的方法来解决这个问题?
答案 0 :(得分:1)
自我加入应该适合你。
SELECT a.NAME,
a.phoneNumber
FROM PATIENT a
JOIN PATIENT b
ON a.phoneNumber = b.phoneNumber
AND a.NAME <> b.NAME
答案 1 :(得分:1)
我认为这会给你预期的答案。
select parent_q.NAME,
parent_q.phoneNumber
from PATIENT parent_q
where (select count(sub_q.phoneNumber)
from PATIENT sub_q
where sub_q.phoneNumber = parent_q.phoneNumber) > 1
答案 2 :(得分:0)
我认为你需要一个自我加入:
SELECT *
FROM PATIENT P1 JOIN PATIENT P2 ON (P1.phoneNumber = P2.phoneNumber)
结果如下:
'aaa''12345''bbb''12345'
'bbb''12345''aaa''12345'
'ccc''00000''ddd''00000'
'ddd''00000''ccc''00000'
正如你所看到的,会有“重复行”,因为对于对称属性,如果A具有相同的B数,则B具有相同的A数。
答案 3 :(得分:0)
没有人喜欢使用GROUP BY或分析功能?
SELECT name, phonenumber
FROM patient
WHERE phonenumber IN ( SELECT phonenumber FROM patient
GROUP BY phonenumber
HAVING COUNT(*) > 1 )
或
SELECT name, phonenumber FROM (
SELECT name, phonenumber, COUNT(*) OVER ( PARTITION BY phonenumber ) AS patient_cnt
FROM patient
) WHERE patient_cnt > 1