1

会社の部門からの古いデータベースを処理する必要があります。このDBは、ハードウェアの割り当てと追跡を管理するために使用されます。

現在の MS Access がタスクに対して遅くなってきているので、c# で新しいフロントを構築しようとしています。

(テーブルと行の名前は、理解を深めるために英語に翻訳しています)

  • tbl_hardware
  • tbl_hardware_assignment
  • tbl_accounts
  • tbl_typebradmodel (今のところ重要ではなく、自明です)

tbl_hardware には、HW_ID、シリアル番号、タイプ、モデル、ブランドなどの列が含まれています (その他のハードウェアの必要な情報)

tbl_hardware_assignment には、列 ID、HW_ID (tbl_hardware.ID と一致する)、nameID (tbl_accounts.PersID と一致する)、および以降 (int 値形式の日付 [YYYYMMDD] エントリが作成されたとき (そうではありませんでした、私の考えでは...) )

tbl_account には列 PersID、Login などが含まれます (その他の内部情報)

これは私の現在のSQLステートメントです

SELECT tbl_hardware.HW_ID,
       tbl_hardware.Aktiv,
       tbl_hardware.typebradmodelID,
       tbl_type.tabel AS Type,
       tbl_brand.tabel AS Brand,
       tbl_model.tabel AS Model,
       tbl_accounts.Login,
       tbl_hardware_assignment.since
FROM tbl_hardware
LEFT OUTER JOIN tbl_typebradmodel ON tbl_hardware.typebradmodelID = tbl_typebradmodel.typebradmodelID
LEFT OUTER JOIN tbl_type ON tbl_typebradmodel.TypID = tbl_type.TypID
LEFT OUTER JOIN tbl_brand ON tbl_typebradmodel.MarkeID = tbl_brand.MarkeID
LEFT OUTER JOIN tbl_model ON tbl_typebradmodel.ModelID = tbl_model.ModelID
LEFT OUTER JOIN tbl_hardware_assignment ON tbl_hardware.HW_ID = tbl_hardware_assignment.HW_ID
LEFT OUTER JOIN tbl_accounts ON tbl_hardware_assignment.namenID = tbl_accounts.PersID
WHERE tbl_hardware.Aktiv = 1 AND 
      tbl_hardware.typebradmodelID in 
      (SELECT tbl_typebradmodel.typebradmodelID
       FROM tbl_typebradmodel
       LEFT OUTER JOIN tbl_type ON tbl_typebradmodel.TypID = tbl_type.TypID
       LEFT OUTER JOIN tbl_brand ON tbl_typebradmodel.MarkeID = tbl_brand.MarkeID
       LEFT OUTER JOIN tbl_model ON tbl_typebradmodel.ModelID = tbl_model.ModelID
       WHERE tbl_typebradmodel.MarkeID = 
             (SELECT tbl_brand.MarkeID 
              FROM tbl_brand 
              WHERE tbl_brand.tabel LIKE 'Samsung')
      ) AND 
      tbl_hardware.HW_ID in 
      (SELECT tbl_hardware_assignment.HW_ID 
       FROM tbl_hardware_assignment, 
            (SELECT MAX(tbl_hardware_assignment.since) AS lastchange,
                    tbl_hardware_assignment.HW_ID
             FROM tbl_hardware_assignment 
             GROUP BY tbl_hardware_assignment.HW_ID) lastentry
       WHERE tbl_hardware_assignment.namenID = 
             (SELECT tbl_accounts.PersID 
              FROM tbl_accounts 
              WHERE tbl_accounts.Login = 'MY_USERNAME') AND 
             tbl_hardware_assignment.HW_ID = lastentry.HW_ID AND
             tbl_hardware_assignment.since = lastentry.lastchange
      )

結果:

9778    1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER1   20100218
9778    1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER2   20100218
10497   1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER3   20100810
10498   1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER3   20100810
10498   1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER4   20100819
10497   1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER4   20100819
10497   1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   MY_USERNAME 20120601
10498   1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   MY_USERNAME 20120601
9778    1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER3   20130502
9778    1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER5   20130507
9778    1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   USER3   20130619
9778    1   2868    Monitor 24" TFT Samsung SyncMaster 2494HM   MY_USERNAME 20130725

しかし、あまりにも多くの結果が得られ、1 つのハードウェアで間違った/複数のユーザー マッピングが行われています。

私の間違いがどこにあるのか分かりますか?

ところで:このステートメントだけで正しい値が返されます

SELECT tbl_hardware_assignment.HW_ID 
FROM tbl_hardware_assignment, 
     (SELECT MAX(tbl_hardware_assignment.since) AS lastchange, 
             tbl_hardware_assignment.HW_ID
      FROM tbl_hardware_assignment 
      GROUP BY tbl_hardware_assignment.HW_ID) lastentry
WHERE tbl_hardware_assignment.namenID = 
      (SELECT tbl_accounts.PersID 
       FROM tbl_accounts 
       WHERE tbl_accounts.Login = 'MY_USERNAME') AND 
      tbl_hardware_assignment.HW_ID = lastentry.HW_ID AND 
      tbl_hardware_assignment.since = lastentry.lastchange

結果:

10497   20120601
10498   20120601
11554   20120601
12353   20120601
13665   20120918
13196   20121129
14616   20130701
15073   20130705
9778    20130725

(会社のものをオフィスの外に移植するべきではないので、結果や SQL ステートメントを台無しにしないことを願っています。)

出力の例を次に示します PASTEBIN

4

3 に答える 3

0

これをコメントに入れたかったのですが、必要な担当者ポイントがありません。

結合を変更してみましたか?出力を見ると、おそらく INNER JOIN を試すことをお勧めします。

于 2013-07-26T08:48:55.843 に答える