1

数日前に質問をしましたが、別のルートをたどることに決めたので、編集が少し面倒になったので質問をやり直します。

2 つの列を含むデータのリストがあります。

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

しかし、ご覧のとおり、順序が逆になり、それぞれが 2 倍になり、3 つ以上の sKey があるインスタンスにヒットすると、少しおかしくなります :\

誰にもアイデアがありますか、それとも私を正しい方向に向けることができますか?

4

1 に答える 1

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

SQL フィドルのデモ

これにより、上記とはわずかに異なる結果が生成されます。

表示される最初の 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

AutoNumber を使用した SQL Fiddle のデモ

于 2013-04-09T23:28:26.257 に答える