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



我使用的是MS SQL Server,我正在努力查询所有没有"活动"设置请求(TREQUEST表)的"服务中"中继(TRELAY表)。

TRELAY与TREQUEST有一对多的关系。TREQUEST中的记录可能具有各种状态("未就绪"、"挂起"、"活动"、"已被取代")。

我尝试过子查询和联接(左/内),但我无法让查询返回一个没有活动设置请求记录的不同中继记录。它返回了重复的中继记录和所有重复的被取代的设置请求。

我试过使用不喜欢的"活动",但我得到了中继记录的多个记录。

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

我感谢你能提供的任何帮助。如果您需要任何其他信息,请告诉我。

谢谢,Joe C.

看看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中没有相应条目的所有行"——你只需要在not EXISTS子句中指定确切的条件

您已经接近了,请尝试反转您的逻辑。首先找到所有不同的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值。我将您的良好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代码。

如果你需要更多的解释,请告诉我。希望能有所帮助。:)

最新更新