2009-04-22 10 views
0
私はMS SQL DBを使用しています

の内側に、異なるタイプの2値を比較し、私は3つのテーブルを持っている:「base_info」、「メッセージ」、「config」をは、サブクエリ

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 

[OK]をので、今、私はサブクエリを持っています設定テーブルから 'SignalRec'と 'SignalOut'を選択し、IDと日付(上記には含まれていません)でメッセージテーブルに一致させると、問題はメッセージのどこに一致する必要があるかです.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 

私はできる限り、これは明らかなように作ってみましたが、あなたはより多くの情報が必要な場合は私に知らせて:ここで
は、私がこれまで持っているものです。

+0

私はこのために良いタイトルを考えることもできませんでした。 –

答えて

0

に参加する必要があるようにあなたの説明から、

2

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

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

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

2
アンソニーが指摘したように、あなたはおそらくで RecBy列に文字列を正規化したい

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 

しかし私は、これはトリックを行うことができると思い

(私はそれを試していませんが...)、 messagesテーブルの場合、同じデータがbasesテーブルにあるためです。あなたは、2つの私は、私はそのことについて申し訳ありませんが、私がやりたいことは十分明らかにされていないかもしれないと思う

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 
+0

私は正常化するための猶予はありません。サブクエリの内部でこれを行うことはできますか? –

+0

私が示したクエリは、正規化せずに動作するはずです。それはありませんか?どのようなエラーや予期しない結果がありますか? –

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...) 

だから、これは本質的に1が整数で、もう一方が文字列であっても、異なるテーブルの2つのRecBy年代を比較します。それは私にマッチを思い出させ、Excelでルックアップする。

+0

これはサブクエリの内部で動作しますか? –

+0

これはサブクエリの内部で動作しますか? - はい、そうです –