我使用的是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
我试图尽可能清楚地说明这一点,但如果您需要更多信息请告诉我。
答案 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中查找。