0

私は MS SQL データベースを使用しており、「base_info」、「messages」、「config」の 3 つのテーブルがあります。

bases:
ID    Name   NameNum
====================================
 1    Home    101
 2    Castle  102
 3    Car     103

messages:
ID    Signal    RecBy    HQ
============================
111    120      Home     1
111    110      Castle   1
111    125      Car      1
222    120      Home     2
222    125      Castle   2
222    130      Car      2
333    100      Home     1
333    110      Car      2

config:
ID  SignalRec  SignalOut  RecBy   HQ
====================================
111     60        45       101    1
111     40        60       102    1
222     50        60       102    2
222     30        90       101    2
333     80        10       103    1

わかりましたので、構成テーブルから 'SignalRec' と 'SignalOut' を選択し、メッセージ テーブルで ID と日付 (上記には含まれていません) で照合するサブクエリがあります。 messages.RecBy = config.RecBy ですが、config.RecBy は文字列ですが、同等です Name はベース テーブルにあります。したがって、サブクエリまたは何らかのタイプの結合内でサブクエリを実行し、返された値を比較する必要がほとんどあります。
これが私がこれまでに持っているものです:

(SELECT TOP 1 config.SignalRec from config WHERE config.ID = messages.ID AND ||I need th other comparison here||...Order By...) As cfgSignalRec,
(SELECT TOP 1 config.SignalOut from config WHERE config.ID = messages.ID AND ||I need th other comparison here||...Order By...) As cfgSignalOut

これをできるだけ明確にしようとしましたが、さらに情報が必要な場合はお知らせください。

4

4 に答える 4

2

メッセージ テーブルの RecBy を正規化して、ベース テーブルを参照します。ベースでも参照されている場合、なぜそこに文字列コンテンツを挿入するのでしょうか?

これこそまさに、正規化が存在する理由です。つまり、冗長性を減らし、あいまいさを減らし、参照整合性を強化します。

これをより明確にするために、メッセージ テーブルの RecBy は Bases への外部キーである必要があります。

于 2009-04-22T22:09:40.317 に答える
2

これでうまくいくと思います(試したことはありませんが...)

SELECT 
    c.SignalRec 
FROM config c 
    INNER JOIN bases b 
        ON c.RecBy = b.NameNum 
    INNER JOIN messages m 
        ON b.Name = m.RecBy
WHERE c.ID = m.ID

ただし、Anthony が指摘したように、テーブルに同じデータがあるため、おそらくテーブルのRecBy列の文字列を正規化する必要があります。messagesbases

于 2009-04-22T22:16:00.020 に答える
0

あなたの説明から、2つのJOINSが必要なように思えます

SELECT TOP 1
    c.SignalRec
FROM 
    config c
INNER JOIN 
    bases b
ON c.RecBy = b.NameNum
INNER JOIN
    messages m
ON b.Name = m.RecBy
于 2009-04-22T22:17:04.073 に答える
0

何がしたかったのかが十分に明確になっていない可能性があると思います。申し訳ありません。相関関係は同じですが、2 つのテーブルのデータは実際には異なります。システムの仕組みについて詳しく説明せずに説明するのは、ややこしいです。
私は実際にこれを行う非常に高速な方法を見つけました。
サブクエリ内でこれを行います:

(SELECT TOP 1 config.Signal FROM config,bases 
     WHERE config.ID = messages.ID AND bases.Name = messages.RecBy AND bases.NameNum = 
     config.RecBy Order By...)  

したがって、これは基本的に、一方が整数で他方が文字列であっても、異なるテーブルの 2 つの RecBy を比較します。マッチを思い出してエクセルで調べる。

于 2009-04-24T12:26:59.813 に答える