我使用的是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代码。
如果你需要更多的解释,请告诉我。希望能有所帮助。:)