2

基本的な考え方は、Access 2007 に次の形式のテーブルがあるということです。

Company Name |     Address     | Product
Company A      123 Fakestreet    Phone
Company A      123 Fakestreet    Computer
Company A      123 Fakestreet    Car
Company B      456 Fakestreet    Football
Company B      456 Fakestreet    Basketball
Company B      456 Fakestreet    Golf Ball

そして、私はそれをこの形にしたい:

Company Name |     Address     | List of Products
Company A      123 Fakestreet    Phone, Computer, Car
Company B      456 Fakestreet    Football, Basketball, Golf Ball

Allen Browne の ConcatRelated 関数 ( http://allenbrowne.com/func-concat.html ) を使用してみましたが、VBA コンテンツを有効にするのを忘れたため、最初は機能しませんでした。私はそれをしましたが、今では Access がフリーズし続け、応答しません。以下のクエリを使用しました (テーブルの名前は Addresses です)。私はそれが機能するかどうかを確認するためだけに列 Address を省略しました。その後、元に戻すつもりでした。

SELECT Company_Name, ConcatRelated("Product","Addresses")
FROM Addresses;

誰かがそれで何か問題があると思いますか?私が考えることができる唯一のことは、テーブルのサイズ (〜 290,000 行) が遅すぎる可能性があるということですが、問題なくテーブルでさまざまなクエリを実行しました。

4

2 に答える 2

3

モジュールを作成し、次のコードを追加します。

Function liststuff(company)

    Dim curr As Database
    Dim rs As Recordset
    Dim SQLCmd As String
    Dim productList As String

    Set curr = CurrentDb()

    SQLCmd = "SELECT Product FROM table1 WHERE [Company Name] = """ & company & """"

    Set rs = curr.OpenRecordset(SQLCmd)

    If Not rs.EOF Then
        rs.MoveFirst
    End If

    Do While Not rs.EOF
        productList = productList & rs(0) & ", "
        rs.MoveNext
    Loop

    liststuff = productList

End Function

データベースの値を実際のテーブル名とフィールド名に変更する必要がある場合があります。

クエリで次を使用します。

SELECT Table1.[Company Name], Table1.Address, Liststuff([Company Name]) AS [List of Products]
FROM Table1
GROUP BY Table1.[Company Name], Table1.Address;
于 2013-06-28T05:40:25.113 に答える
1

「考えられる唯一のことは、テーブルのサイズ (~290,000 行) が遅すぎる可能性があるということですが、問題なくテーブルに対してさまざまなクエリを実行しました。」

ConcatRelated()他のクエリよりもはるかに大きなワークロードを db エンジンに課します。基本的に、エンジンは個別のクエリを実行して、結果セットの各行の関連値を収集および連結する必要があります。

290K 行が問題の原因であると思われる場合は、小さなサンプル テーブルをデータ ソースとして使用して、クエリを設計およびテストします。その小さなテーブルでクエリが機能するようになったら、そのデータ ソースを大きなテーブルに切り替えます。

ただし、別の問題があると思われます。Browne 氏は、3 番目のパラメーターstrWhereを受け入れる関数を作成しましたが、関数に 2 つのパラメーターのみを指定していることに注意してください。テーブルConcatRelated()のすべてのProductフィールド値を連結するように求めているようです...そして結果セットのすべての行に対してその連結を再度行います。Addressesそれがあなたが実際に望んでいることだとは思いません。

イミディエイト ウィンドウ ( Ctrl+ g) に移動し、式をテストして、単一の会社に必要なものを提供します。大まかな推測として、おそらくこのようなものが必要です...

? ConcatRelated("Product","Addresses", "[Company Name]='Company A'")

適切なConcatRelated式を見つけたら、現在の値を渡して、それを使用するようにクエリを調整します[Company Name]

strWhereパラメーターにフィールドに基づく条件が含まれている場合は[Company Name]、そのフィールドにインデックスを付ける必要があるため、データベース エンジンは一致する行を見つけるために完全なテーブル スキャンを実行する必要がありません。

于 2013-06-27T18:27:49.293 に答える