2009-04-22 130 views
0

我使用的MS SQL db和內不同類型的2個值I有3個表:「base_info」,「消息」,「配置」比較子查詢

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和Date(未包含在上面)在消息表上匹配它,問題是我需要它匹配messages.RecBy = config.RecBy但config.RecBy是一個字符串,但它是等價的名稱是在基礎表中。所以我幾乎需要在子查詢或某種類型的連接中執行子查詢並比較返回的值。
這是我到目前爲止有:

(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

我也想不出一個好的標題。 – 2009-04-22 22:08:00

回答

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的,即使一個是一個整數,而另一個是字符串。它讓我想起了一場比賽,並在Excel中查找。

2

我會標準化出您的消息表中的RecBy來引用基表。爲什麼你會在那裏插入字符串內容,如果它也是基地引用?

這正是存在規範化的原因:減少冗餘,減少歧義並強制引用完整性。

爲了使這更清楚,消息表中的RecBy應該是基礎的外鍵。

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 

然而,正如安東尼指出的那樣,你可能想在該RecBy列正常化出弦messages表,因爲您在bases表中具有相同的數據。

+0

我沒有持續規範化。我可以在子查詢中做到這一點嗎? – 2009-04-22 23:07:46

+0

我顯示的查詢應該沒有標準化就能正常工作。不是嗎?你會得到什麼樣的錯誤/意外結果? – 2009-04-22 23:31:49

0

從你的描述,它只是聽起來像你需要兩個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