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)
成千上万的记录不适合现代的数据库这么大的量无论如何,如果性能不理想,在eventid
和segmentcode
上添加索引(如果还没有的话)应该加快select
的查询速度。
用IN进行子查询会更好吗?有数千条记录。 – Dev