【问题标题】:Access Query; Creating Master/Slave from list访问查询;从列表中创建主/从
【发布时间】:2013-04-09 23:04:37
【问题描述】:

几天前问了一个问题,但决定走另一条路,所以我重新做这个问题,因为编辑变得有点混乱。

我有一个包含两列的数据列表:

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 的实例时,它有点疯狂:\

任何人有任何想法,或者可以指出我正确的方向吗?

【问题讨论】:

  • 为什么你的主/从是100/2318和102/6546?不明白主人的命令?使用 MIN 还是第一个实例?这两个例子是不同的。
  • 抱歉你是对的,这是一个错字,已经修正了。

标签: sql ms-access ms-access-2003


【解决方案1】:

如果您尝试使用 MIN(skey) 作为您的 Master,那么这样的事情应该可以工作:

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 Fiddle Demo

这会产生与上述结果略有不同的结果。

如果您想要的结果是使用显示的第一个 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

SQL Fiddle Demo With AutoNumber

【讨论】:

  • 谢谢,可以在 SQL Server 2008 中使用。有没有简单的方法可以翻译它以便在 Access 2003 中使用?我的 SQL 访问非常受限/受限:(
  • @MichaelCarn-Bennett -- 如果您可以将自动编号添加到您的表中并将其命名为 id,那么第二个查询应该非常接近您的需要。访问对连接周围的括号有点特别,因此您可能需要相应地括起来。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多