2017-01-20 14 views
0

テーブルで克服するのに面白い問題があります。フルパーツデータベース(私たちは自由にハックするのではなく、必要なクエリを実行しません)からのデータの簡略化されたセットを保存しました。私は、エンジニアが空間(xyz位置とxyz回転)と領域内の位置を含む完全に複製されたアセンブリを作成した場所を見つける必要があります。私は基本的にメインシステムの削除のためにそれらをリストアウトする必要があります。表にはトップレベルのアセンブリが示されており、それは第1レベルの子です。 Part_1(0,0,0 0,0,0)
  | - - | Part_2(0,0,0 0,0,0)
 MS Access構造テーブル内の行のグループと一致します

Assembly_1
 すなわち

| - Part_3(0,0,0 0,0,0)

Assembly_2
  | - Part_1(0,0,0 0,0,0)
  | - Part_2(0,0,0 0,0,0)
  | - Part_3(0,0,0 0,0,0)

Assembly_3
  | - Part_1(500,0,0 0,0,0)
  | - Part_2(500 、0,0 0,0,0)
  | - Part_3(500,0,0 0,0,0)

Assembly_4
  | - Part_4(0,0,0 0,0、 0)
  | - Part_5(0,0,0 0,0,0)
  | - Part_6(0,0,0 0,0,0)のような1つのテーブルに格納され


:例で

 
Parent ID | Child ID | Assembly Level | Area | Position 
Assembly_1 | Assembly_1 | 0    | 0001 | 0,0,0 0,0,0 
Assembly_1 | Part_1  | 1    | 0001 | 0,0,0 0,0,0 
Assembly_1 | Part_2  | 1    | 0001 | 0,0,0 0,0,0 
Assembly_1 | Part_3  | 1    | 0001 | 0,0,0 0,0,0 
Assembly_2 | Assembly_2 | 0    | 0001 | 0,0,0 0,0,0 
Assembly_2 | Part_1  | 1    | 0001 | 0,0,0 0,0,0 
Assembly_2 | Part_2  | 1    | 0001 | 0,0,0 0,0,0 
Assembly_2 | Part_3  | 1    | 0001 | 0,0,0 0,0,0 
Assembly_3 | Assembly_3 | 0    | 0001 | 0,0,0 0,0,0 
Assembly_3 | Part_1  | 1    | 0001 | 500,0,0 0,0,0 
Assembly_3 | Part_2  | 1    | 0001 | 500,0,0 0,0,0 
Assembly_3 | Part_3  | 1    | 0001 | 500,0,0 0,0,0 
Assembly_4 | Assembly_4 | 0    | 0002 | 0,0,0 0,0,0 
Assembly_4 | Part_4  | 1    | 0002 | 0,0,0 0,0,0 
Assembly_4 | Part_5  | 1    | 0002 | 0,0,0 0,0,0 
Assembly_4 | Part_6  | 1    | 0002 | 0,0,0 0,0,0

Iはアセンブリ1 & 2が表示されることを期待します、アセンブリ3ではなく、同じパーツを使用していますが、x、y、zの位置が異なり、アセンブリ4ではなく異なるパーツを使用し、別の領域にあるためです。

 
Assembly | Cloned Assembly | Area 
Assembly_1 | Assembly_2 | 0001 

そして、あなたはどこアセンブリ1 & 2スワップ両側追加行で終わる場合、私は気にしない:私が望む何

のようなもので抽出することです。これは、構造全体を手動で検索するよりもはるかに美味です!

私はSQLでこれに近づくことさえできないので、これはVBAソリューション(主に私がSQLを理解するよりもはるかにVBAを理解しているように、 (私は、20000を超える広告申込情報があり、全データセットを検索し、商品内の400個のエリアと比較していると信じています)、これは約30+がある商品ごとに繰り返されます。

重複を抽出するために以下の例を試しましたが(実際にレベル0のアセンブリが誤って製品に挿入された場所を抽出するためにはうまくいきました)、これは1行が別の行いくつかの行のグループは別のグループと一致します。

ヘルプ/ガイダンス、またはVBAの使用を肯定するだけでも大歓迎です!

更新されたSQL:

SELECT DISTINCT 
    a1.GROUP, 
    a1.SUB_GROUP, 
    a1.ParentID AS Assembly, 
    (SELECT DISTINCT AssemblyTable.NAME 
     FROM AssemblyTable 
     WHERE AssemblyTable.ChildID=a1.ParentID) AS NAME, 
    (SELECT DISTINCT AssemblyTable.OWNER 
     FROM AssemblyTable 
     WHERE AssemblyTable.ChildID=a1.ParentID) AS OWNER, 
    a1.Area, 
    (SELECT DISTINCT AssemblyTable.ITEM_CREATION 
     FROM AssemblyTable 
     WHERE AssemblyTable.ChildID=a1.ParentID) AS ITEM_CREATION, 
    a2.ParentID AS CLONED_ASSEMBLY, 
    (SELECT DISTINCT AssemblyTable.NAME 
     FROM AssemblyTable 
     WHERE AssemblyTable.ChildID=a2.ParentID) AS CLONE_NAME, 
    (SELECT DISTINCT AssemblyTable.OWNER 
     FROM AssemblyTable 
     WHERE AssemblyTable.ChildID=a2.ParentID) AS CLONE_OWNER, 
    (SELECT DISTINCT AssemblyTable.ITEM_CREATION 
     FROM AssemblyTable 
     WHERE AssemblyTable.ChildID=a2.ParentID) AS CLONE_CREATION 
FROM (SELECT * FROM AssemblyTable ORDER BY AssemblyTable.ITEM_CREATION ASC) AS a1 
    INNER JOIN (SELECT * FROM AssemblyTable ORDER BY AssemblyTable.ITEM_CREATION ASC) AS a2 
     ON (a1.ParentID < a2.ParentID) 
     AND (a1.Area = a2.Area) 
     AND (a1.[Position] = a2.[Position]) 
     AND (a1.ChildID=a2.ChildID) 
WHERE a1.ParentID<>a2.ParentID 
ORDER BY a1.GROUP, a1.SUB_GROUP, a1.Area, a1.ParentID; 

表今ある:

 
Parent ID | Child ID |  Name  | OWNER | Assembly Level | Area | Position | ITEM_CREATION 
Assembly_1 | Assembly_1 | Assembly_1_Name | User_1 | 0    | 0001 | 0,0,0 0,0,0 | 01-01-2016 
Assembly_1 | Part_1  | Part_1_Name  | User_1 | 1    | 0001 | 0,0,0 0,0,0 | 01-01-2016 
Assembly_1 | Part_2  | Part_2_Name  | User_1 | 1    | 0001 | 0,0,0 0,0,0 | 01-01-2016 
Assembly_1 | Part_3  | Part_3_Name  | User_1 | 1    | 0001 | 0,0,0 0,0,0 | 01-01-2016 
Assembly_2 | Assembly_2 | Assembly_2_Name | User_2 | 0    | 0001 | 0,0,0 0,0,0 | 01-01-2017 
Assembly_2 | Part_1  | Part_1_Name  | User_2 | 1    | 0001 | 0,0,0 0,0,0 | 01-01-2017 
Assembly_2 | Part_2  | Part_2_Name  | User_2 | 1    | 0001 | 0,0,0 0,0,0 | 01-01-2017 
Assembly_2 | Part_3  | Part_3_Name  | User_2 | 1    | 0001 | 0,0,0 0,0,0 | 01-01-2017 
Assembly_3 | Assembly_3 | Assembly_3_Name | User_3 | 0    | 0001 | 0,0,0 0,0,0 | 01-01-2016 
Assembly_3 | Part_1  | Part_1_Name  | User_3 | 1    | 0001 | 500,0,0 0,0,0 | 01-01-2016 
Assembly_3 | Part_2  | Part_2_Name  | User_3 | 1    | 0001 | 500,0,0 0,0,0 | 01-01-2016 
Assembly_3 | Part_3  | Part_3_Name  | User_3 | 1    | 0001 | 500,0,0 0,0,0 | 01-01-2016 
Assembly_4 | Assembly_4 | Assembly_4_Name | User_4 | 0    | 0002 | 0,0,0 0,0,0 | 01-01-2016 
Assembly_4 | Part_4  | Part_4_Name  | User_4 | 1    | 0002 | 0,0,0 0,0,0 | 01-01-2016 
Assembly_4 | Part_5  | Part_5_Name  | User_4 | 1    | 0002 | 0,0,0 0,0,0 | 01-01-2016 
Assembly_4 | Part_6  | Part_6_Name  | User_4 | 1    | 0002 | 0,0,0 0,0,0 | 01-01-2016

私は時折、まだ見てい:

 
Assembly | Cloned Assembly | Area 
Assembly_2 | Assembly_1 | 0001 
+0

VBAは、ここにあなたの友人になるだろう。 SQLで比較できるようにファイルを平坦化しようとする可能性がありますが、それは悪夢に変わる可能性があります。 (特に、あなたの例のようにアセンブリごとに3つではなく、アセンブリごとに可変量の部品を持つことができる場合) – abraxascarab

答えて

0

self joinと同じテーブルを自分自身に追加する場合を考えてみましょう。一致する必要のある列で結合条件を作成し、異なるParentIDのフィルターを適用します。そしてreverse duplicatesが平等よりも大きい/小さいと特別ON句を使用を避けるために:

Self Join SQL Diagram

SELECT DISTINCT a1.ParentID AS Assembly, a2.ParentID AS ClonedAssembly, a1.Area 
FROM AssemblyTable AS a1 
INNER JOIN AssemblyTable AS a2 
    ON (a1.ParentID < a2.ParentID) AND (a1.Area = a2.Area) 
    AND (a1.[Position] = a2.[Position]) AND (a1.ChildID = a2.ChildID) 
WHERE a1.ParentID <> a2.ParentID; 

-- Assembly Cloned_Assembly Area 
-- Assembly_1  Assembly_2 0001 
+0

うわー...........ありがとう!私はそれが最後に比較的単純なクエリだったとは信じられません!私はループとVBAを使用して、すべてのアセンブリを通過するという考えを恐れていました。あなたはヒーローです! – Rob

+0

途中でON句を使用しても、アセンブリとアセンブリの両方でAssembly_1を取得した場合の影響が取り除かれているようには見えませんでした。元々働くためには、上記の私のコメントはまだ立っており、感謝の気持ちが残っています!既に短縮されたリストをスピンダウンするための小さなVBAは、今はそれほど大きなことではないでしょう。 – Rob

+0

お詫び申し上げます、最後のコメントを忘れてしまいました。私は誤ってテーブルの代わりにデザインビューを押すので、MS Accessがクエリを不正にしました!正しいクエリを再適用し、すべてが世界でうまくいいです! – Rob

0

あなたは間違いなく、VBAを使用したほうが良いでしょう、しかし、いくつかの保存クエリは、比較プロセスのスピードアップに役立ちます。 Assembly ID、Count(ChildID)、Min(Child ID)、Sum(位置+アセンブリ全体の回転)というクエリを作成します。

これは非常に迅速に「正確ではないクローン」の可能性の大部分を排除し、部分ごとにチェックすることは非常に少ないままです。

関連する問題