SQL - 获取与其他记录匹配的记录在同一个表中

问题描述:

我正在使用Amazon RedShift PostgreSQL数据库。SQL - 获取与其他记录匹配的记录在同一个表中

有一个在我的数据库中的表存储约会记录是这样的:

| id | patientname | providername | eventid | eventstart   | eventend   | isactive | segmentcode | Description   | 
|----|---------------|--------------|---------|---------------------|---------------------|----------|-------------|------------------------| 
| 1 | Susie Jones | John Melton | 340000 | 2017-08-08 10:00:00 | 2017-08-08 10:00:00 | true  | 845685  | Reminder Call   | 
| 2 | Susie Jones | John Melton | 340000 | 2017-08-08 10:00:00 | 2017-08-08 10:30:00 | true  | 365478  | Steam Therapy Session | 
| 3 | Roschel Ross | Kate Winny | 350000 | 2017-08-09 11:00:00 | 2017-08-09 11:00:00 | true  | 845685  | Reminder Call   | 
| 4 | Roschel Ross | Kate Winny | 350000 | 2017-08-09 11:00:00 | 2017-08-09 13:30:00 | true  | 367545  | Physio Therapy Session | 
| 5 | Lilly Hodge | Jessica  | 360000 | 2017-08-09 11:00:00 | 2017-08-09 11:00:00 | true  | 754544  | Doctor appointment  | 
| 6 | Jack Richards | Mike Chong | 37000 | 2017-08-10 17:00:00 | 2017-08-10 17:30:00 | true  | 889754  | Sample Appointment  | 
| 7 | Sammy Jones | Winsten  | 38000 | 2017-08-10 17:00:00 | 2017-08-10 18:30:00 | true  | 845685  | Physio Therapy Session | 
| 8 | Sammy Jones | Winsten  | 38000 | 2017-08-10 17:00:00 | 2017-08-10 17:00:00 | true  | 454542  | Reminder Call   | 

在这里,你可以看到有一些记录与segmentcode 845685,而所有这些记录都具有重复记录用不同的分段代码,但是相同的标识号

我要的是,使用SQL查询得到记录有段代码845685,其重复的记录一起。所以得到的表格将是:

| id | patientname | providername | eventid | eventstart   | eventend   | isactive | segmentcode | Description   | 
|----|---------------|--------------|---------|---------------------|---------------------|----------|-------------|------------------------| 
| 1 | Susie Jones | John Melton | 340000 | 2017-08-08 10:00:00 | 2017-08-08 10:00:00 | true  | 845685  | Reminder Call   | 
| 2 | Susie Jones | John Melton | 340000 | 2017-08-08 10:00:00 | 2017-08-08 10:30:00 | true  | 365478  | Steam Therapy Session | 
| 3 | Roschel Ross | Kate Winny | 350000 | 2017-08-09 11:00:00 | 2017-08-09 11:00:00 | true  | 845685  | Reminder Call   | 
| 4 | Roschel Ross | Kate Winny | 350000 | 2017-08-09 11:00:00 | 2017-08-09 13:30:00 | true  | 367545  | Physio Therapy Session | 
| 7 | Sammy Jones | Winsten  | 38000 | 2017-08-10 17:00:00 | 2017-08-10 18:30:00 | true  | 845685  | Physio Therapy Session | 
| 8 | Sammy Jones | Winsten  | 38000 | 2017-08-10 17:00:00 | 2017-08-10 17:00:00 | true  | 454542  | Reminder Call   | 

我该怎么办?

看来,简单的子查询(如单程),就足够了:

select * from t 
where eventid in (select eventid from t where segmentcode = 845685) 
-- order by eventid, ... 

另一种方法是使用exists

select * from t t1 
where 
exists (select 1 from t t2 where eventid = t1.eventid and segmentcode = 845685) 

成千上万的记录不适合现代的数据库这么大的量无论如何,如果性能不理想,在eventidsegmentcode上添加索引(如果还没有的话)应该加快select的查询速度。

+0

用IN进行子查询会更好吗?有数千条记录。 – Dev