sql - 具有复杂排序要求的访问查询
问题描述
我必须从不断扩展的数据集中生成 QQ 图。为了做到这一点,我必须让两列彼此独立排序。
像这样:
主表
F1 | F2
---+----
6 | 10
8 | 7
2 | 5
决赛桌应该是这样排序的:
F1 | F2
---+----
2 | 5
6 | 7
8 | 10
我试图用两个连接的子查询和一个为每个子查询添加行号的 VBA 函数来做到这一点。它没有返回任何值,尽管每个子查询都独立工作。
这是我尝试使用的 SQL 查询:
SELECT
wautonumber([Au_org_gpt]) AS index_no,
ORG.Project, ORG.Au_org_gpt AS Au_org_gpt_QQ,
MTS.Au_mts_gpt AS Au_mts_gpt_QQ
FROM
(SELECT
wautonumber([Au_org_gpt]) AS index_no,
MCIPLD_geochem_mts.Project, MCIPLD_geochem_mts.Au_org_gpt
FROM
MCIPLD_geochem_mts
ORDER BY
MCIPLD_geochem_mts.Au_org_gpt) AS ORG
INNER JOIN
(SELECT
wautonumber([Au_mts_gpt]) AS index_no,
MCIPLD_geochem_mts.Project, MCIPLD_geochem_mts.Au_mts_gpt
FROM
MCIPLD_geochem_mts
ORDER BY
MCIPLD_geochem_mts.Au_mts_gpt) AS MTS ON ORG.index_no = MTS.index_no;
解决方案
假设这两个字段在每条记录中都有数据。
如果两个字段都有唯一的数值,请考虑:
SELECT Query1.Seq, Query1.F1, Query2.F2
FROM
(SELECT DCount("*","Main","F2<=" & [F2]) AS Seq, Main.F2
FROM Main ORDER BY Main.F2) AS Query2
INNER JOIN
(SELECT DCount("*","Main","F1<=" & [F1]) AS Seq, Main.F1
FROM Main ORDER BY Main.F1) AS Query1
ON Query2.Seq = Query1.Seq
ORDER BY Query1.Seq;
另一种查询方法需要两个查询对象:
查询1
SELECT "F1" AS Src, F1 AS Data FROM Main
UNION SELECT "F2", F2 FROM Main;
查询 2
TRANSFORM First(Query1.Data) AS FirstOfData
SELECT DCount("*","Query1","Src='" & [Src] & "' AND Data<=" & [Data]) AS Seq
FROM Query1
GROUP BY DCount("*","Query1","Src='" & [Src] & "' AND Data<=" & [Data])
PIVOT Query1.Src;
对于大型数据集,这两种解决方案都可能执行缓慢。
这是VBA方法。构建一个名为 MainSorted 的表,其中包含 3 个字段:
Seq - 自动编号
F1 - 编号
F2 - 编号
Sub MainSort()
Dim rsSrc As Recordset, db As Database
Dim lngRow As Long
Set db = CurrentDb
db.Execute "DELETE FROM MainSorted"
db.Execute "INSERT INTO MainSorted(F1) SELECT F1 FROM Main ORDER BY F1"
Set rsSrc = db.OpenRecordset("SELECT F2 FROM Main ORDER BY F2")
lngRow = DMin("Seq", "MainSorted")
While Not rsSrc.EOF
db.Execute "UPDATE MainSorted SET F2=" & rsSrc!F2 & " WHERE Seq = " & lngRow
rsSrc.MoveNext
lngRow = lngRow + 1
Wend
End Sub
或者这个版本:
Sub MainSort()
Dim rsSrc1 As Recordset, rsSrc2 As Recordset, db As Database
Set db = CurrentDb
db.Execute "DELETE FROM MainSorted"
Set rsSrc1 = db.OpenRecordset("SELECT F1 FROM Main ORDER BY F1")
Set rsSrc2 = db.OpenRecordset("SELECT F2 FROM Main ORDER BY F2")
While Not rsSrc1.EOF
db.Execute "INSERT INTO MainSorted(F1,F2) VALUES(" & rsSrc1!F1 & "," & rsSrc2!F2 & ")"
rsSrc1.MoveNext
rsSrc2.MoveNext
Wend
End Sub
考虑到@CPerkins 评论:
Sub MainSort()
Dim rsSrc1 As Recordset, rsSrc2 As Recordset, rsDest As Recordset, db As Database
Set db = CurrentDb
db.Execute "DELETE FROM MainSorted"
Set rsSrc1 = db.OpenRecordset("SELECT F1 FROM Main ORDER BY F1")
Set rsSrc2 = db.OpenRecordset("SELECT F2 FROM Main ORDER BY F2")
Set rsDest = db.OpenRecordset("SELECT * FROM MainSorted")
While Not rsSrc1.EOF
rsDest.AddNew
rsDest!F1 = rsSrc1!F1
rsDest!F2 = rsSrc2!F2
rsDest.Update
rsSrc1.MoveNext
rsSrc2.MoveNext
Wend
End Sub
推荐阅读
- stripe-payments - Omnipay Stripe 添加 listPlan 限制参数
- reactjs - Django + React 应用程序部署在 GAE Flex 上,但静态文件不起作用
- python - 如何从 plt.imshow() 或 plt.matshow() 中提取数据?
- html - Tailwind (CSS Grid) 每个网格元素的大小相同
- kubernetes - Spinnaker 部署策略 Kubernetes 与 Istio
- swift - 在 swift 中,如何在应用程序委托中实现一个变量,以便在应用程序的任何地方检索它?
- python - 我想创建一个二维列表,其行和列作为输入,其元素是行号和列号的乘积
- c - 指向可变修改类型的指针的指针算法
- swiftui - SwiftUI在多个HStacks中对齐不同长度的文本
- awk - 试图从 awk getline + 变量中获取单行输出