Sql 是否可以使用查询转换数据?
编辑:标题可能有误导性,因为转置可能是我试图实现的目标的错误词语。我愿意听取建议Sql 是否可以使用查询转换数据?,sql,ms-access,Sql,Ms Access,编辑:标题可能有误导性,因为转置可能是我试图实现的目标的错误词语。我愿意听取建议 我有两张桌子,tblBase和tblLinks。tblLinks包含tblBase中记录的URL。下图显示了这些表和关系的基本版本 tblBase tblBaseID Title tblLinks tblLinksID tblBaseIDFK LinkURL 我期待着开发一个查询或报告,将显示在tblBase中的记录和一种平面表中的所有相关链接。以下是一个例子: tblBase: tblBaseID---T
我有两张桌子,tblBase和tblLinks。tblLinks包含tblBase中记录的URL。下图显示了这些表和关系的基本版本 tblBase
tblBaseID
Title
tblLinks
tblLinksID
tblBaseIDFK
LinkURL
我期待着开发一个查询或报告,将显示在tblBase中的记录和一种平面表中的所有相关链接。以下是一个例子:
tblBase:
tblBaseID---Title
1-----------ABC
2-----------DEF
3-----------HIJ
特布利克斯:
tblLinksID---tblBaseIDFK---LinkURL
1------------1-------------ABCLink1
2------------1-------------ABCLink2
3------------2-------------DEFLink1
4------------2-------------DEFLink2
5------------2-------------DEFLink3
这是我根据样本数据寻找的最终结果:
理想情况下,我希望能够使用查询来创建它,但我不知道这是否可行。作为最后的手段,我可以编写VBA来填充一些临时表,并在TBLLINK中遍历每条记录,将数据放在适当的位置。如果查询不可能,也许有一个比临时表更好的解决方案,有人可以告诉我
谢谢。我建议两种不同的选择 第一个选项:静态查询,此选项的优点是简单,但缺点是在tblBase中每次重新编码N个链接时是静态的
SELECT B.tblBaseID
, B.Title
, MAX(IIF( L.BaseIdRank = 1, L.LinkURL, '')) AS Link1
, MAX(IIF( L.BaseIdRank = 2, L.LinkURL, '')) AS Link2
, MAX(IIF( L.BaseIdRank = 3, L.LinkURL, '')) AS Link3
FROM tblBase AS B
LEFT JOIN
(SELECT L1.tblLinksID
, L1.tblBaseIDFK
, L1.LinkURL
, COUNT(*) AS BaseIdRank
FROM tblLinks AS L1
INNER JOIN
tblLinks AS L2
ON L1.tblLinksID >= L2.tblLinksID
AND L1.tblBaseIDFK = L2.tblBaseIDFK
GROUP BY L1.tblLinksID
, L1.tblBaseIDFK
, L1.LinkURL
) AS L
ON B.tblBaseID = L.tblBaseIDFK
GROUP BY B.tblBaseID, B.Title;
这是结果表
第二个选项:此选项的优点是它可以很好地处理dinamic数量的链接,缺点是您需要在一个模块中创建函数
第一步。在模块中创建以下函数
Public Function createLinksByBase() As String
On Error Resume Next
' Delete resulting table if it exists
CurrentDb.Execute "DROP TABLE tblLinksByBase"
' Variables
Dim nMaxLinks As Integer
Dim i As Integer
Dim sSQL As String
' Get max number of links
sSQL = "SELECT MAX(links) AS max_links " & _
"FROM (SELECT tblBaseIDFK " & _
" , COUNT(*) AS links " & _
" FROM tblLinks " & _
" GROUP BY tblBaseIDFK " & _
" ) L"
nMaxLinks = CurrentDb.OpenRecordset(sSQL)!max_links
' Prepare query for generate table
sSQL = ""
For i = 1 To nMaxLinks
sSQL = sSQL & " , MAX(IIF( L.BaseIdRank = " & i & ", L.LinkURL, '')) AS Link" & i & " "
Next i
sSQL = "SELECT B.tblBaseID " & _
" , B.Title " & _
sSQL & _
"INTO tblLinksByBase " & _
"FROM tblBase AS B " & _
" LEFT JOIN " & _
" (SELECT L1.tblLinksID " & _
" , L1.tblBaseIDFK " & _
" , L1.LinkURL " & _
" , COUNT(*) AS BaseIdRank " & _
" FROM tblLinks AS L1 " & _
" INNER JOIN " & _
" tblLinks AS L2 " & _
" ON L1.tblLinksID >= L2.tblLinksID " & _
" AND L1.tblBaseIDFK = L2.tblBaseIDFK " & _
" GROUP BY L1.tblLinksID " & _
" , L1.tblBaseIDFK " & _
" , L1.LinkURL " & _
" ) AS L " & _
" ON B.tblBaseID = L.tblBaseIDFK " & _
"GROUP BY B.tblBaseID, B.Title"
' Create resulting table
CurrentDb.Execute (sSQL)
createLinksByBase = "Ready"
End Function
第2步:调用函数,例如,您可以使用此函数创建视图
SELECT createLinksByBase() AS status
每次运行查询时,都会创建/刷新一个表“tblLinksByBase”
我希望此选项可以帮助您可能重复@Wolph为什么sql server与ms access相关?请看一个交叉表查询。谢谢,@Wolph,但我的示例包含两个链接表,这与您链接到的表的情况非常不同。@Fionnuala,虽然乍一看交叉表查询就是答案,但交叉表似乎是输出聚合,我不想在这里聚合。如果你发布数据而不是图片,你可能会得到更多帮助。图像在设置测试时没有多大用处。