2

私は3つのテーブルを持っています。

  • テーブルデータには、「data.txt」ファイルからの個々のパーツのデータが含まれています。
  • テーブル制限には、「limits.txt」ファイルからのデータテーブルの制限が含まれています。
  • テーブルファイルは、上記の個々の.txtファイルのリストです。

したがって、「ファイル」テーブルは次のようになります。ご覧のとおり、これは存在する各ファイルのリストです。LimitsAファイルには、タイプAのすべてのデータファイルの制限が含まれます。

ID  File_Name  Type  Sub-Type
1   DataA_10   A     10
2   DataA_20   A     20
3   DataA_30   A     30
4   LimitsA    A     NONE
5   DataB_10   B     10
6   DataB_20   B     20
7   LimitsB    B     NONE

「データ」テーブルは次のようになります。File_IDは、「ファイル」テーブルの外部キーです。具体的には、これは上記のDataA_10のデータになります。

ID  File_ID  Dat1  Dat2  Dat3... Dat20
1   1        50    52    53 
2   1        12    43    52 
3   1        32    42    62 

「制限」テーブルは次のようになります。File_IDは、「ファイル」テーブルの外部キーです。具体的には、これは上記のLimitsAのデータになります。

ID  File_ID  Sub-Type  Lim1  Lim2
1   4        10        40    60    
2   4        20        20    30    
3   4        30        10    20    

したがって、私がやりたいのは、「Limit」テーブルの正しい制限を、対応する「Data」テーブルのデータに結合することです。DataA_10の各行には、LimitsAテーブルの「40」と「60」の制限があります。残念ながら、制限テーブルをデータテーブルに直接リンクする方法はありません。これを行う唯一の方法は、ファイルテーブルを振り返って、LimitsAとDataA_10がタイプAであることを確認することです。これら2つをリンクしたら、サブタイプ10の制限を取得するだけで済みます。

結局、こんな感じの結果が欲しいです。

結果:

ID  File_ID  Dat1  Dat2  Dat3... Dat20  Lim1  Lim2
1   1        50    52    53             40    60
2   1        12    43    52             40    60
3   1        32    42    62             40    60

これが理解できるほど明確であることを願っています。2つ以上のテーブルを結合する問題のように思えますが、現時点ではオンラインで適切な解決策を見つけることができませんでした。あなたが解決策やアドバイスを持っているなら、それは大いにありがたいです。

4

1 に答える 1

1

'Files'テーブルは、実際には2つの別個の(ただし関連する)概念であり、マージされています。サブクエリを使用してそれらを分割すると、結合を行うのがはるかに簡単になります。このように結合することは最も効率的な方法ではありませんが、与えられたスキーマもそうではないことに注意してください...

SELECT Data.*, Limits.Lim1, Limits.Lim2
FROM (SELECT * FROM Files WHERE SubType IS NOT NULL) DataFiles
JOIN (SELECT * FROM Files WHERE SubType IS NULL) LimitFiles
  ON LimitFiles.Type = DataFiles.Type
JOIN Data 
  ON DataFiles.ID = Data.File_ID
JOIN Limits
  ON LimitFiles.ID = Limits.File_ID
  AND DataFiles.SubType = Limits.SubType
ORDER BY Data.File_ID

アップデート

スキーマを改善する方法をより具体的に説明すると、現在、Filesテーブルにはデータと制限ファイルのエントリを区別する明確な方法がありません。これを除けば、データエントリには単一の制限ファイルエントリへの明確なリンクがありません。これらは両方とも上記のSQLのように理解できますが、そのようなロジックはクエリオプティマイザーではうまく機能しない可能性があり、必要なデータ制限リンクを保証することはできません。

次のオプションを検討してください。

  • を介して「制限」ファイルTypeにリンクする代わりに、制限エントリに直接リンクしますId。そのリンクに外部キーを設定して、予想されるLimitエントリが使用可能であることを確認します。
  • 'Limit'エントリを'Data'エントリから分離するために、それらを別のテーブルに配置します。
  • 外部キーにインデックスを作成します。さらに言えば、すべての外部キーにインデックスを追加します。SQLServerはデフォルトではこれを行いません。

これらのうち、私は外部キーを持つことが不可欠であり、他のものはささやかな改善であると考えます。

于 2012-11-19T17:11:20.523 に答える