Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以使用查询转换数据?_Sql_Ms Access - Fatal编程技术网

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,虽然乍一看交叉表查询就是答案,但交叉表似乎是输出聚合,我不想在这里聚合。如果你发布数据而不是图片,你可能会得到更多帮助。图像在设置测试时没有多大用处。