加入两个表,列出第一个表中的所有结果

时间:2016-12-18 20:21:56

标签: sql ms-access

我有两个彼此相关的表。第一个表在后一个表上具有一个或多个相同属性。 (存在一对多的关系)因此后一个表上的行基本上包括以下列:(PK,FK,属性)。第一个表的某些行没有属性,也没有记录在后一个表中。

我想列出第一个表中的所有行,并为后一个表中的属性添加一个额外的列。当我使用内连接或where子句时,我无法列出没有属性的结果。但是我要做的是列出第一个表中的所有行,如果没有属性,我想让额外的列为null,如果它有多个属性,我想连接它们在那一栏中

我知道我不会在这里分享任何代码,而是以抽象的方式提问,因为首先我需要知道使用哪种工具以及以何种方式使用。我用select语句和ISNULL等方法尝试了连接和子查询,但我不确定我在做什么,但它对我没用。

PS:我是新来的网站,你可以观察到。因此,如果您认为这不是提问的正确方式,并且如果您建议在论坛上删除此问题,我将毫无疑问。

1 个答案:

答案 0 :(得分:1)

SELECT TableA.*, TableB.Attribute
FROM TableA LEFT JOIN TableB ON TableA.PK = TableB.FK

编辑:我刚刚更全面地阅读了原始问题,并意识到这并不是你所追求的。如果TableB中没有相关数据,这将为您提供所需的NULL值,但是如果您希望TableB中的多个相关值连接到给定TableA记录的一行,则需要编写函数。创建一个新模块,在这里添加以下功能。我假设你的PK和FK列是Long Integer,属性值是String。我也假设您正在使用MS-Access。

Public Function ListAttributes(lngPK As Long) As String

    Dim rsAttributes As DAO.Recordset
    Dim strResult as String

    Set rsAttributes = CurrentDB.OpenRecordset("SELECT Attribute FROM TableB WHERE FK = " & lngPK)
    Do While Not rsAttributes.EOF
        strResult = strResult & ", " & rsAttributes!Attribute
        rsAttributes.MoveNext
    Loop
    If strResult <> "" Then
        strResult = Mid(strResult, 3)
    End If
    ListAttributes = strResult
    Set rsAttributes = Nothing

End Function

您的查询将变为

SELECT *, ListAttributes(PK) FROM TableA

请注意,对于TableA中没有TableB中相应行的行,您现在将获得一个空字符串而不是NULL,但是如果需要,您始终可以使用IIf函数调用来解决此问题。