会社の部門からの古いデータベースを処理する必要があります。この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