2010-11-10 83 views
1

我在Access 2003中的表具有以下字段找到獨特的行集

Ptr_RateTable 
MinOfWeight_Up_To 
Adder 

我需要找到MinOfWeight_Up_To唯一值的任何表,不顯示在搜索結果的表名。我試圖通過查找可以在相同體重中斷時縮合的表格來濃縮大型機中的表格大小。

因此,例如

Ptr_RateTable|MinOfWeight_Up_To 
1109LW020|1.00 
1109LW020|2.00 
1109LW020|6.00 
1109LW020|11.00 
1109LW020|101.00 
1109LW020|128.00 
1109LW020|129.00 
1109LW021|1.00 
1109LW021|2.00 
1109LW021|3.00 
1109LW021|11.00 
1109LW021|36.00 
1109LW021|41.00 
1109LW021|151.00 

我想看到下面的結果,而不是讓另一個「個人資料」具有相同的重量打破

Profile1|1.00|2.00|6.00|11.00|101.00|128.00|129.00 
Profile2|1.00|2.00|3.00|11.00|36.00|41.00|151.00 
+0

我看不出你如何能避免表名,但有一個交叉表查詢和一些VBA你應該能夠實現類似的東西。這是你的選擇嗎? – Fionnuala 2010-11-10 15:57:46

+0

想想看,表名稱的東西有點混亂。查詢很少在結果中顯示錶名。 – Fionnuala 2010-11-10 16:09:08

+0

如果您有命名空間衝突,即在SELECT中具有相同基名但來自不同表的兩個字段,則可以顯示錶名。雖然SourceTable始終可以作爲記錄集的Fields集合的屬性訪問。 – 2010-11-11 04:07:49

回答

0

首先,你需要一個功能爲該表格生成簽名。一些類似於:

Public Function GetSignature(sTableName As String) As String 

Dim oDB As DAO.Database 
Dim oRS As DAO.Recordset 
Dim sSQL As String 
Dim sResult As String 

sSQL = "Select Distinct MinOfWeight_Up_To" _ 
    & vbCrLf & "From [" & sTableName & "]" 
    & vbCrLf & "Order By MinOfWeight_Up_To" 

Set oDB = DBEngine.Workspaces(0).Databases(0) 
Set oRS = oDB.OpenRecordset(sSQL, dbOpenForwardOnly, dbReadOnly) 

Do Until oRS.EOF 
    sResult = sResult & "|" & Nz(oRS(0)) 
    oRS.MoveNext 
Loop 

GetSignature = result 

Set oRS = Nothing 
Set oDB = Nothing 

End Function 

一旦你的,你就需要另外一個例程來組裝表的列表,每個表調用上面的簽名,並將結果存儲在一個臨時表。然後,您可以在該臨時表中查找唯一的簽名列表。

應該指出,字符串連接的gazillions將非常緩慢。相反,您應該查找可用於構建簽名的更高效的字符串構建器類的實現。

+0

你對交叉表查詢有什麼不滿嗎? – Fionnuala 2010-11-10 21:47:06

+0

@Remou - 我沒有任何反對crosstabs的地方。但我不認爲他們是這個特定工作的工具。海報需要所有數據值的簽名。交叉表會爲每個值生成一個列。您可以通過從某個列連接來從交叉表中獲取簽名,但如果您打算這樣做,則可以編寫一個直接爲您提供簽名的函數。 – Thomas 2010-11-10 22:16:20

0

使用交叉表查詢:

Dim rs As New ADODB.Recordset 
Dim cn As New ADODB.Connection 

Set cn = CurrentProject.Connection 

sSQL = "TRANSFORM Min(s.MinOfWeight_Up_To) AS Min_Weight " _ 
& "SELECT 'Profile' & Right([Ptr_RateTable],2) AS Profile " _ 
& "FROM Sample s " _ 
& "GROUP BY s.Ptr_RateTable " _ 
& "PIVOT s.MinOfWeight_Up_To" 

rs.Open sSQL, cn 

astr = rs.GetString 
Do While InStr(astr, Chr(9) & Chr(9)) > 0 
    astr = Replace(astr, Chr(9) & Chr(9), Chr(9)) 
Loop 

Debug.Print astr