2012-11-12 36 views
1

我試過四處搜尋無濟於事,所以希望你能在這裏幫助。我一直在爲此奮鬥了幾天。數據在MS Access中,如果這有助於解答。如果這不是正確的方案使用這個建議如何進行是非常受歡迎的。查詢連接表,無效重複

我從表1和表2開始,想要結束表3(如下)。

Field2(table1)和Field4(table2)是相同的值(相同)。但是,因爲當我嘗試進行連接時,它們具有2個相同的值(即1000),所以會造成太多重複。我基本上希望在Field 1的決賽桌中只出現一次(不重複),並且第一次從Field 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 
+0

表2中的字段1與表1中的字段1有關?似乎您缺少一個值,通過該值可以根據您的示例數據集從表2中濾除不想要的「L」值。你可以發佈你正在使用的SQL來獲得不需要的結果(表4)嗎? – jn29098

+0

正如您已經注意到的,當一個表中的2行與另一個表中的2行匹配時,會有4個可能的結果行,並且DBMS默認將返回所有行。您希望使用什麼標準來決定應保留哪些行? –

+0

@ jn29098對不起,我現在沒有在我面前,但可以明天更新。字段2涉及字段4.它們具有匹配的值。 – losty

回答

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