用于从第一个表中检索记录的SQL查询,该表在第二个表中没有匹配的子查询

时间:2017-01-19 15:47:48

标签: sql sql-server

我正在使用MS SQL Server,而我正在努力查询所有" In Service"继电器(TRELAY表)没有"有效"设置请求(TREQUEST表)。

TRELAY与TREQUEST有一对多的关系。 TREQUEST中的记录可以具有各种状态('未准备好''待定','活跃''被取代')。

我已经尝试了子查询和连接(左/内),但是我无法获得查询以返回没有活动设置请求记录的不同中继记录。它返回重复的Relay记录,包含所有重复的Superseded Setting Requests。

我已经尝试使用Not like' Active'但我获得了多条Relay记录的记录。

T.S06 is the Status from the TRELAY table (string field)
R.S03 is the Setting Status from the TREQUEST tabe (string field)

SELECT T.ID, T.S06, R.S03 FROM TRELAY T
LEFT JOIN TREQUEST R ON R.RELAYID = T.ID AND  R.S03 NOT LIKE '%ACTIVE%'
WHERE T.S06 LIKE '%IN SERVICE%'

上述查询的结果:

Relay ID || Status     || Setting Status
========================================
303      || In Service || Superseded
307      || In Service || Superseded
307      || In Service || Superseded
307      || In Service || Superseded

感谢您提供的任何帮助。如果您需要任何其他信息,请与我们联系。

谢谢, 乔C.

2 个答案:

答案 0 :(得分:0)

使用NOT EXISTS来看看,就像这种方法一样:

SELECT x
FROM Table1 t1
WHERE NOT EXISTS(
    SELECT * FROM Table2 t2 
    WHERE t2.Identifier = t1.Identifier AND...any other conditions...
)

这就是说,"找到表1中表2和#34中没有相应条目的所有行。 - 您只需要在NOT EXISTS子句中指定确切的条件

答案 1 :(得分:0)

你很接近,试着颠倒你的逻辑。首先找到所有不同的Active RelayID。然后将他们加入你的T.id并只抓住不匹配。

SELECT T.ID, T.S06 
FROM TRELAY as T
LEFT JOIN 
(SELECT Distinct RELAYID FROM TREQUEST WHERE S03 LIKE '%ACTIVE%') as R 
ON T.ID = R.RELAYID
WHERE T.S06 LIKE '%IN SERVICE%' AND R.RELAYID IS NULL;

R.RELAYID IS NULL检查不匹配。因此,您可以从TRELAY表中获得所有不同的T.ID。

如果您需要返回并抓取每个T.ID的所有其他“设置状态”,您可以将此设置链接回您的TREQUEST表。

希望有所帮助:)

*编辑*

回应评论:

"When I use (Select T.ID, T.S06, TREQUEST.S03 FROM TRELAY AS T, TREQUEST) I get a multi-part identifier T.ID could not be bound. Do I need to do another join before the Left Join."

是的,您可以对我上面发布的SQL执行INNER JOIN。下面是一些代码,可以将您的好T.ID集合返回TREQUEST表,并提取与每个唯一T.ID相关的所有良好的S03值。我将您的Good T.ID值标记为GoodTID。我将您对TREQUEST表的新链接标记为GoodR

SELECT GoodTID.ID, GoodTID.S06, GoodR.S03
FROM TREQUEST as GoodR
INNER JOIN

(SELECT T.ID, T.S06 
FROM TRELAY as T
LEFT JOIN 
(SELECT Distinct RELAYID FROM TREQUEST WHERE S03 LIKE '%ACTIVE%') as R 
ON T.ID = R.RELAYID
WHERE T.S06 LIKE '%IN SERVICE%' AND R.RELAYID IS NULL) as GoodTID

ON GoodTID.ID = GoodR.RELAYID;

此代码将为您提供IN SERVICE而非ACTIVE的所有RELAYID和S03代码。

如果您需要更多解释,请与我们联系。希望有所帮助。 :)