我有下表。
____________________________________
| carid | changeid | data1 | data2 |
|_______|__________|_______|_______|
| 1 | 1 |a |b |
| 1 | 2 |c |d |
| 1 | 3 |e |f |
| 2 | 3 |g |h |
| 2 | 2 |i |j |
| 2 | 4 |k |l |
| 3 | 5 |m |n |
| 3 | 1 |o |p |
| 4 | 6 |q |r |
| 4 | 2 |s |t |
|_______|__________|_______|_______|
我想选择以下结果:
| carid | changeid | data1 | data2 |
|_______|__________|_______|_______|
| 1 | 1 |a |b |
| 1 | 2 |c |d |
| 1 | 3 |e |f |
| 3 | 5 |m |n |
| 3 | 1 |o |p |
|_______|__________|_______|_______|
用语言说: 如果一行有changeid = 1,我想选择具有相同carid的所有行和changeid = 1的行。
使用多个选择的查询很容易解决这个问题。首先选择changeid = 1的所有行,然后选择那些carid并选择带有这些carid的所有行。很简单。
我更想知道是否有可能解决这个问题没有使用多个选择?我最好找一个更快的解决方案,但我可以自己尝试一下。
答案 0 :(得分:3)
您可以将表格加入自身
SELECT DISTINCT a.*
FROM YourTable a
INNER JOIN YourTable b ON b.carid = a.carid and b.changeid = 1
表a是您要输出的所有行,按表b过滤,将设置限制为具有changeid = 1的行。
这应该具有出色的性能,因为一切都是以面向集合的方式完成的。
如果changeid 1可能只发生一次,则可能不需要 DISTINCT
,如果可能的话应该避免使用,因为它可能会对大型结果集产生重大的性能影响。
答案 1 :(得分:1)
对于多项选择,您的意思是使用IN?
SELECT carid, changeid, data1, data2
FROM YourTable
WHERE carid IN (SELECT carid FROM YourTable WHERE changeid = 1)
答案 2 :(得分:0)
大多数数据库都支持窗口功能。你可以这样做:
select carid, changeid
from (select t.*,
max(case when changeid = 1 then 1 else 0 end) over
(partition by carid) as HasChangeId1
from YourTable t
) t
where HasChangeId1 = 1;
如果" 1"是更改ID的最小值,可以简化为:
select carid, changeid
from (select t.*,
min(changeid) over (partition by carid) as MinChangeId
from YourTable t
) t
where MinChangeId = 1;
答案 3 :(得分:-2)
听起来你只是在表格中存在carid和changeid的组合之后,在这种情况下,DISTINCT将仅为您返回唯一的组合。不确定这是不是你想要的但是试一试并检查你的预期行为......
SELECT DISTINCT CARID, CHANGEID FROM UnknownTable