比较子查询中的2个不同类型的值

时间:2009-04-22 22:06:43

标签: sql join subquery

我使用的是MS SQL数据库,我有3个表:'base_info','messages','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

好的,现在我有一个子查询,在其中我从配置表中选择'SignalRec'和'SignalOut'并在消息表上按ID和日期(不包括在上面)匹配它,问题是我需要它匹配message.RecBy = config.RecBy,但config.RecBy是一个字符串,但它是等效的Name在bases表中。所以我几乎需要在子查询或某种类型的连接中做一个子查询并比较返回的值 以下是我到目前为止的情况:

(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 个答案:

答案 0 :(得分:2)

我会在你的消息表中规范化RecBy以引用基表。如果它也在base中引用,为什么要在那里插入字符串内容?

这正是存在规范化的原因:减少冗余,减少歧义并强制引用完整性。

为了使其更清楚,消息表中的RecBy应该是Bases的外键。

答案 1 :(得分: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表中messages列中的字符串规范化,因为bases表中的数据相同。

答案 2 :(得分: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

答案 3 :(得分: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中查找。