2

そのため、正規化が発明される前にセットアップされたように見える非常に古いデータベースを使用できることを嬉しく思います。私はそれを正しく機能させる方法を考え出すことができるかどうかを確認するよう求められました.

最初のテーブルには、実際の主キーのようなものがあります。例:

ID, Reason
--- ----------
 1, Write off
 2, Overage
 3, OLH

問題は他のテーブルです...

CustomerNum, JobNum, Reasons
------------ ------- ---------------------
      42351,     46, X
      32313,    456,    X
      85472,     13,   X    X

これらのテーブルはシステム内でどのように結合されていますか? はい、行の X の位置です。したがって、X が最初の位置にある場合、それは理由 1、2 番目の位置、理由 2 などです。これは基本的にフラット配列です。実際には、1行あたり1 Xに制限されていれば、それほど悪くはありません... ( LOCATE('X', REASONS) as XINDEX)しかし、そうではありません。理論的には、各行でチェックできる X は 21 個あります。

そのため、私は彼らにそれを機能させる方法について推奨する必要があります。
私の最初の推奨事項の 1 つは、別のテーブルを作成してテーブルを正規化することですが、それがうまくいくかどうか、またはシステムを変更する意思があるかどうかはわかりません。
そのため、各行を処理して、別のテーブルにあるかのようにインデックスを返すことができるストアド プロシージャのようなものも提案したいと思います。

これが可能かどうかはわかりませんが、期待しています。

編集

ええ、私は本当にリンクテーブルをプッシュするつもりです。
提案から取り組んだ代替案は次のとおりです。

Select tblCustomers.*, 
CASE WHEN SUBSTRING(Reasons,1,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 1)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,2,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 2)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,3,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 3)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,4,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 4)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,5,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 5)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,6,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 6)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,7,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 7)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,8,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 8)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,9,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 9)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,10,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 10)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,11,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 11)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,12,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 12)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,13,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 13)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,14,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 14)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,15,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 15)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,16,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 16)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,17,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 17)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,18,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 18)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,19,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 19)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,20,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 20)) || ', ' ELSE '' END 
|| CASE WHEN SUBSTRING(Reasons,21,1) = 'X' THEN RTRIM((SELECT Reason FROM tblReasons WHERE ID = 21)) || ', ' ELSE '' END AS XPOS 
From tblCustomers

Marlin の提案を少し試して、どれだけ合理化されるかを確認する必要がありますが、このクエリで気に入っていることの 1 つは、現在のレイアウトがいかにばかげているか、およびなぜそれを変更する必要があるかを示していることです。

4

2 に答える 2

1

私は本当に新しいリンク テーブルを提案したいと思いますが、ここにストアド プロシージャの要点、またはリンク テーブルを設定する方法があります。

SELECT Customers.CustomerNum, Reasons.ID
FROM Customers, Reasons
WHERE SUBSTR(Customers.Reasons, Reasons.ID, 1) = 'X'
于 2012-10-11T17:57:28.000 に答える
1

最初に行うことは、X の可能な位置ごとに新しい列を作成し (したがって、10 の位置がある場合 -> 10 の新しい列)、それらの列に意味のある名前を付けることです。その後、クエリを簡単に作成できます...

于 2012-10-11T17:45:39.847 に答える