我有两个彼此相关的表。第一个表在后一个表上具有一个或多个相同属性。 (存在一对多的关系)因此后一个表上的行基本上包括以下列:(PK,FK,属性)。第一个表的某些行没有属性,也没有记录在后一个表中。
我想列出第一个表中的所有行,并为后一个表中的属性添加一个额外的列。当我使用内连接或where子句时,我无法列出没有属性的结果。但是我要做的是列出第一个表中的所有行,如果没有属性,我想让额外的列为null,如果它有多个属性,我想连接它们在那一栏中。
我知道我不会在这里分享任何代码,而是以抽象的方式提问,因为首先我需要知道使用哪种工具以及以何种方式使用。我用select语句和ISNULL等方法尝试了连接和子查询,但我不确定我在做什么,但它对我没用。
PS:我是新来的网站,你可以观察到。因此,如果您认为这不是提问的正确方式,并且如果您建议在论坛上删除此问题,我将毫无疑问。
答案 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
函数调用来解决此问题。