0

我正在使用 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 和日期在消息表上匹配它(不包括在上面),问题是我需要它来匹配 where 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

我试图尽可能清楚地说明这一点,但如果您需要更多信息,请告诉我。

4

4 回答 4

2

我会在您的消息表中规范化 RecBy 以引用基表。如果在基础中也引用了字符串内容,为什么还要在其中插入字符串内容?

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

为了更清楚地说明这一点,messages 表中的 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列中的字符串messages,因为表中具有相同的数据bases

于 2009-04-22T22:16:00.020 回答
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
于 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,即使一个是整数而另一个是字符串。它让我想起了匹配并在 Excel 中查找。

于 2009-04-24T12:26:59.813 回答