几天前问了一个问题,但已经决定采用不同的路线,所以我正在重新做这个问题,因为编辑有点乱。
我有一个包含两列的数据列表:
pID sKey
100 8611
100 2318
101 3516
101 5413
102 6546
102 5646
102 8411
103 8795
103 5845
出现的第一个sKey将成为该pID的主sKey,之后的每个sKey将成为一个奴隶。数据看起来像这样。
pID sKey sKey_1
100 8611 2318
101 3516 5413
102 6546 5646
102 6546 8411
103 8795 5845
此查询让我关闭
SELECT MyTable.pID, MyTable.sKey, MyTable_1.sKey
FROM MyTable
INNER JOIN MyTable AS MyTable_1
ON MyTable.pID = MyTable_1.pID
WHERE (((IIf([MyTable.sKey]=[MyTable_1.sKey],"Y","N"))="N"))
pID sKey sKey
100 2318 8611
100 8611 2318
101 3516 5413
101 5413 3516
102 5646 6546
102 5646 8411
102 6546 5646
102 6546 8411
102 8411 5646
102 8411 6546
103 5845 8795
103 8795 5845
但正如你所看到的那样,它会颠倒顺序并使每个顺序加倍,当它遇到一个有3个或更多sKey的实例时,它会有点疯狂:\
任何人都有任何想法,或者能指出我正确的方向吗?
答案 0 :(得分:1)
如果您尝试使用MIN(skey)作为主人,那么这样的事情应该有效:
select
p.pId,
p.skey,
p3.skey skey1
from mytable p
join (select pID, min(skey) minskey
from mytable
group by pID
) p2 on p.pid = p2.pid and p.skey = p2.minskey
join mytable p3 on p.pid = p3.pid and p.skey != p3.skey
这会产生与上述结果略有不同的结果。
如果您想要的结果是使用显示的第一个skey,那么我建议您在表中添加一个Identity / AutoNumber列来播种。如果没有该列,则无法保证结果的顺序。所以假设你要添加这样一个列,那么这样的东西应该可以工作:
select
p.pId,
p.skey,
p3.skey skey1
from mytable p
join (select pID, min(id) minId
from mytable
group by pID
) p2 on p.id = p2.minId
join mytable p3 on p.pid = p3.pid and p.id <> p3.id
order by p.pid, p3.id