真正需要多项选择吗?

时间:2013-07-09 13:39:52

标签: sql

我有下表。

____________________________________
| 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的所有行。很简单。

我更想知道是否有可能解决这个问题没有使用多个选择?我最好找一个更快的解决方案,但我可以自己尝试一下。

4 个答案:

答案 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