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

Sql 比较子查询中不同类型的2个值,sql,join,subquery,Sql,Join,Subquery,我使用的是MS SQL数据库,我有3个表:“基本信息”、“消息”、“配置” bases: ID Name NameNum ==================================== 1 Home 101 2 Castle 102 3 Car 103 messages: ID Signal RecBy HQ ============================ 111 120 Home

我使用的是MS SQL数据库,我有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',并在messages表中按ID和日期(上面未包括)匹配它,问题是我需要它匹配messages.RecBy=config.RecBy,但config.RecBy是字符串,但它的等效名称在base表中。因此,我几乎需要在子查询或某种类型的联接中执行子查询,并比较返回值。
以下是我到目前为止的情况:

(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

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

我将规范化您的messages表中的RecBy,以引用bases表。如果字符串内容也在基中引用,为什么要在那里插入它

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


为了更清楚地说明这一点,messages表中的RecBy应该是base的外键。

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

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


为了更清楚地说明这一点,messages表中的RecBy应该是base的外键。

我认为这可以做到这一点(尽管我没有尝试过…)


但是,正如Anthony所指出的,您可能希望规范化
messages
表中
RecBy
列中的字符串,因为
base
表中的数据相同。

我认为这可以实现这一点(尽管我没有尝试过……)


然而,正如Anthony所指出的,您可能希望规范化
messages
表中
RecBy
列中的字符串,因为
base
表中的数据相同。

根据您的描述,听起来您需要两个连接

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

根据您的描述,听起来您需要两个连接

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

我想我可能不太清楚我想做什么,对此我很抱歉。 这两个表中的数据实际上是不同的,尽管相关性是相同的。如果不详细说明系统是如何工作的,解释起来有点混乱。
实际上,我找到了一种非常快速的方法。
在我的子查询中,我执行以下操作:

(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中查找。

我想我可能还不太清楚我想做什么,对此表示抱歉。 这两个表中的数据实际上是不同的,尽管相关性是相同的。如果不详细说明系统是如何工作的,解释起来有点混乱。
实际上,我找到了一种非常快速的方法。
在我的子查询中,我执行以下操作:

(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中查找。

我也想不出一个好标题。我也想不出一个好标题。我没有能力正常化。我可以在子查询中执行此操作吗?我显示的查询应该可以在不进行规范化的情况下工作。不是吗?你得到了什么错误/意外的结果?我没有责任正常化。我可以在子查询中执行此操作吗?我显示的查询应该可以在不进行规范化的情况下工作。不是吗?您会得到哪些错误/意外结果?