Mysql 连接两张工作表;第一个包含范围列表,第二个包含可能在第一个范围内的数据

Mysql 连接两张工作表;第一个包含范围列表,第二个包含可能在第一个范围内的数据,mysql,vba,excel,Mysql,Vba,Excel,我正在合并两张excel工作表。在开始之前,我想提到我还有mysql workbench,所以我愿意用sql或vba解决这个问题(我应该学习两者)。我正在处理.bed文件,它是基因组坐标的列表。简而言之,数据通过染色体编号(即:chr2)进行索引,然后在染色体上有一个数字起始和终止位置。这些数字位置可以跨越大范围(即:100-10000)或单个位置(即:999-1000)。我有一个涵盖大范围的坐标列表,在一个单独的文件中,我有一个单一位置的列表 具有范围的文件示例: chromosome

我正在合并两张excel工作表。在开始之前,我想提到我还有mysql workbench,所以我愿意用sql或vba解决这个问题(我应该学习两者)。我正在处理.bed文件,它是基因组坐标的列表。简而言之,数据通过染色体编号(即:chr2)进行索引,然后在染色体上有一个数字起始和终止位置。这些数字位置可以跨越大范围(即:100-10000)或单个位置(即:999-1000)。我有一个涵盖大范围的坐标列表,在一个单独的文件中,我有一个单一位置的列表

具有范围的文件示例:

chromosome    start   stop
chr1          4561    6321
chr3          9842   11253
具有单个位置的文件示例:

chromosome   start   stop
chr1          5213   5214
chr3          10254  10255
我希望合并这些工作表,这样,如果在我的单一职位列表中的某个位置在我的范围列表中的范围内,则这两个位置都列在同一行中。这些列表有1000个位置,所以我也希望这个程序能够循环遍历每一行。使用上面列出的示例数据,我希望我的输出如下所示:

期望输出的示例:

chromosome  start   stop  chromosome  start  stop
chr1         4561   6321    chr1      5213   5214
chr3         9842  11253    chr3     10254  10255
有一个高概率,多个单一的位置将落在一个单一的范围内,我想这些被列为单独的行


我很感激能得到的任何帮助!先谢谢你。我渴望学习

这是一个基本的大纲,它在名为“范围”和“位置”的工作表上查询两个表,并在名为“结果”的工作表上输出结果

输入表应该有标题,从左上角的单元格(A1)开始

Sub-SqlJoin()
Dim oConn作为新的ADODB.连接
将oRS设置为新ADODB.Recordset
昏花
将sSQL设置为字符串,将wb设置为工作簿
设置wb=ThisWorkbook
sSQL=“选择一个染色体,一个开始,一个停止,&”_
“b.染色体,b.开始,b.停止”_
“来自a、b”和_

“其中b.start>=a.start和b.stop类似于
从范围中选择a.chromose,a.start,a stop,b.chromose,b.start,b.stop\u表a,位置中b.start>=a.start和b.stop这段代码运行良好,但我最终使用了一个更简单的程序-bedtools。
Sub SqlJoin()

    Dim oConn As New ADODB.Connection
    Dim oRS As New ADODB.Recordset
    Dim sPath
    Dim sSQL As String, wb As Workbook

    Set wb = ThisWorkbook

    sSQL = " select a.chromosome, a.start, a stop," & _
            " b.chromosome, b.start, b.stop " & _
            " from <ranges_table> a, <positions_table> b" & _
            " where b.start >= a.start and b.stop <= a.stop"


    sSQL = Replace(sSQL, "<ranges_table>", _
           Rangename(wb.Worksheets("Ranges").Range("A1").CurrentRegion))

    sSQL = Replace(sSQL, "<positions_table>", _
           Rangename(wb.Worksheets("Positions").Range("A1").CurrentRegion))

    If wb.Path <> "" Then
      sPath = wb.FullName
    Else
      MsgBox "The workbook must be saved first!"
      Exit Sub
    End If

    oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & sPath & "';" & _
                 "Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';"

    oRS.Open sSQL, oConn

    If Not oRS.EOF Then
        wb.Worksheets("Results").Range("A2").CopyFromRecordset oRS
    Else
        MsgBox "No records found"
    End If

    oRS.Close
    oConn.Close

End Sub

Function Rangename(r As Range) As String
    Rangename = "[" & r.Parent.Name & "$" & _
                r.Address(False, False) & "]"
End Function