1

我有下表。

____________________________________
| 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,我想选择所有与changeid = 1的行具有相同carid的行。

这个问题很容易通过使用多个选择的查询来解决。首先选择 changeid=1 的所有行并获取这些卡并选择具有这些卡的所有行。很简单。

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

4

4 回答 4

3

您可以将表连接回自身

SELECT DISTINCT a.*
FROM YourTable a
INNER JOIN YourTable b ON b.carid = a.carid and b.changeid = 1

表 a 是您要输出的所有行,由表 b 过滤,将集合限制为 changeid = 1 的行。

这应该具有出色的性能,因为一切都以面向集合的方式完成。

DISTINCT如果 changeid 1 可能只出现一次,则可能没有必要,应尽可能避免,因为它可能会对大型结果集造成重大的性能影响。

于 2013-07-09T14:02:55.713 回答
1

对于多项选择,您的意思是使用 IN?

SELECT carid, changeid, data1, data2
FROM YourTable
WHERE carid IN (SELECT carid FROM YourTable WHERE changeid = 1)
于 2013-07-09T13:43:36.127 回答
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;
于 2013-07-09T13:52:55.857 回答
-2

听起来您只需要表中存在的 carid 和 changeid 的组合,在这种情况下, DISTINCT 将只为您返回唯一的组合。不确定这是否是您所追求的,但试一试并检查您的预期行为......

SELECT DISTINCT CARID, CHANGEID FROM UnknownTable
于 2013-07-09T13:43:52.877 回答