【问题标题】:ACCESS SQL Inner Join访问 SQL 内连接
【发布时间】:2017-01-16 21:56:10
【问题描述】:

我有一个类似这样的内部关系表:

BOM         CMP   CMPTYPE
1           JTS   A
1           RED   PT
1           BLUE  PT
2           QQ    PT
2           ZZ    PT
JTS         33    PT
JTS         55    PT
JTS         WID   A
WID         LOG   PT
WID         191   DWG
WID         BOX   PACK
.           .     .

在我的查询中,我需要选择 BOM="1" 的所有记录以及存在 BOM="1" 子配置的所有记录,在表中表示为 CMPTYPE="A"。

这是我所追求的配置的准确表示:

1   RED  PT
1   BLUE PT
1   JTS  A
JTS 33   PT
JTS 55   PT
JTS WID  A
WID LOG  PT
WID 191  DWG
WID BOX  PACK

这可以在单个 Access 内部联接中完成吗?

【问题讨论】:

  • 我可能不明白,但你只是想要BOM=1 AND CMPTYPE='A' 的那些情况吗?
  • 为什么你的输出中有 WID 记录?
  • 或者您是否想要BOM=1 的所有行以及存在CMPTYPE="A" 的所有BOM
  • 因此,您获取 BOM = 1 的所有记录,然后如果 CMPTYPE = A,您将获取这些行的 BOM = CMP 的所有记录(在本例中为 JTS),然后如果有任何 CMPTYPE = A 您再来一遍?你是永远做还是只做一次?
  • 如果是特定次数,您可以使用连接来完成。如果它是无限递归,你不能在 Access 中。您可以在支持递归 CTE 的平台中。

标签: sql ms-access inner-join


【解决方案1】:

如果你可以使用 VBA,你绝对可以做到。

这是使用上述数据结构的示例

首先创建一个查询将“Table1”替换为您的“TableName”

另存为 qdfInitQuery

PARAMETERS [Init BOM] Text ( 255 ), [Init CMPType] Text ( 255 );
SELECT CMP
FROM Table1
WHERE (BOM=[Init BOM]) AND (CMPTYPE=[Init CMPType]);   

在新模块中输入此代码

Option Compare Database
Option Explicit

Public Sub testConfig()

    ConfigSelect BOMValue:="1", CMPTypeValue:="A"

End Sub


Public Sub ConfigSelect(BOMValue As String, CMPTypeValue As String)

    Const MY_TABLE      As String = "Table1" ' replace with  your Table name here

    Const REPLACE_LIST  As String = "<ListOfBOMs>"
    Const SELECT_CMPS   As String = "SELECT CMP FROM [" & MY_TABLE & "] WHERE [BOM] In (" & REPLACE_LIST & ")"
    Const VALID_RECORDS As String = "SELECT * FROM [" & MY_TABLE & "] WHERE [BOM] In (" & REPLACE_LIST & ")"

    Dim db          As DAO.Database
    Dim rs          As DAO.Recordset
    Dim qdf         As DAO.QueryDef

    Dim strList     As String
    Dim strBigList  As String
    Dim strSQL      As String

    Set db = CurrentDb

    ' Add First Value
    strList = ","

    ' Get Initial List
    Set qdf = db.QueryDefs("qdfInitQuery")
    With qdf
        .Parameters("Init BOM") = "1"
        .Parameters("Init CMPType") = "A"
        Set rs = .OpenRecordset(dbOpenSnapshot, dbReadOnly)
    End With
    With rs
        While Not .EOF
            strList = strList & """" & !CMP & """," 'leave trailing comma for searches
            .MoveNext
        Wend
        .Close
    End With
    qdf.Close

    If strList = "," Then
        Exit Sub
    End If

    ' Create Big List
    strBigList = strList

    ' Infinite Loop until No More Matches Found
    Do Until strList = ","
        strSQL = Replace(SELECT_CMPS, REPLACE_LIST, Mid$(strList, 2))
        Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot, dbReadOnly)
        If rs.EOF Then
            rs.Close
            Exit Do
        End If

        strList = ","
        With rs
            While Not .EOF
                ' Only Add if it hasn't already been found
                If InStr(strBigList, ",""" & !CMP & """,") <= 0 Then
                    strList = strList & """" & !CMP & """," ' leave trailing comma for searches
                Else
                    Debug.Print "Ignoring Duplicate: " & !CMP
                End If
                .MoveNext
            Wend
            .Close
        End With

        If strList <> "," Then
            strBigList = strBigList & Mid$(strList, 2)
        End If
    Loop

    ' Add first value to initial list
    strBigList = """" & BOMValue & """" & strBigList

    strSQL = Replace(VALID_RECORDS, REPLACE_LIST, strBigList)
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot, dbReadOnly)
    With rs
        While Not .EOF
            ' Only Add if it hasn't already been found
            Debug.Print !BOM & vbTab & !CMP & vbTab & !CMPType
            .MoveNext
        Wend
        .Close
    End With

    db.Close
    Set rs = Nothing
    Set qdf = Nothing
    Set db = Nothing

End Sub

【讨论】:

  • dbmitch - 谢谢。将审查并发布进度。
  • 实施中有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多