查询连接表,void duplicates

时间:2012-11-12 03:14:21

标签: sql ms-access

我试过无所事事,所以希望你能在这里帮忙。我几天来一直在努力解决这个问题。如果这有助于答案,则数据在MS Access中。如果这不是正确的程序,可以使用这个关于如何进行的建议非常受欢迎。

我从表1和表2开始,并希望最终得到表3(如下所示)。

Field2(table1)和Field4(table2)是相同的值(相同)。但是,因为当我尝试连接时它们具有2个相同的值(即1000),所以它会产生太多的重复。我基本上希望在字段1的最后一个表中只出现一次(没有重复)并且它第一次调用字段3中的值而不重复该值(可能存在相同的值,但它们将具有与它们关联的不同Field4 )。

表2中存在的值多于表1中存在的值,有些值需要跳过(即表2中的值1002在表1中没有匹配的“L”值,因此可以忽略)。我不想要的结果的一个例子如表4所示,以供参考。表1可能有一些“L”值,这些值不在表2中,但我仍然希望那些带有空白或填充N / A的单元格返回...

非常感谢!

表1

Field1  Field2
L1      1000
L2      1000
L3      1001
L4      1003
L5      1005

表2

Field3  Field4  Field5  Primary Key
4.5     1000    2000    1
3.4     1000    2000    2
2.4     1001    2001    3
1.7     1002    2002    4
1.4     1003    2003    5

表3 - 我想要的结果

Field1  Field2  Field3  Field5
L1      1000    4.5   2000
L2      1000    3.4   2000
L3      1001    2.4   2001
L4      1003    1.4   2003
L5      1005    NA      NA

表4-我不希望L1和L2重复的结果。

Field1  Field2  Field3  Field5
L1      1000    4.5   2000
L1      1000    3.4   2000
L2      1000    4.5   2000
L2      1000    3.4   2000
L3      1001    2.4   2001
L4      1003    1.4   2003

1 个答案:

答案 0 :(得分:0)

我怀疑使用普通的SQL回答你的问题是不可能的。但是你可以使用一些VBA来提取你需要的行:

Sub ExtractNoDuplicates()
  Dim Rs As Recordset
  Dim precField1 As Variant
  Dim precField2 As Variant
  Dim precID As Variant

  precField1 = Null
  precField2 = Null
  precID = Null

  Set Rs = CurrentDb.OpenRecordset("Select * from Table1 left join Table2 on table1.Field2 = table2.Field4 order by Field2, Field1, ID")

  While Not Rs.EOF
    If (IsNull(precID) Or IsNull(precField1))
       Or (precField1 <> Rs("Field1") And Rs("ID") > precID)
       Or (precField2 <> Rs("Field2")) Then

      precField1 = Rs("Field1")
      precField2 = Rs("Field2")
      precID = Rs("ID")
      ' print the row - or add it to a temporary table
      Debug.Print Rs("Field1"), Rs("Field2"), Rs("Field3"), Rs("Field5"), Rs("id")
      End If
    Rs.MoveNext
  Wend

  Rs.Close
  Set Rs = Nothing

End Sub