Sql 如何在引用3个表时使用in子句检查列是否为特定字符串

Sql 如何在引用3个表时使用in子句检查列是否为特定字符串,sql,sql-server,Sql,Sql Server,我有这个SQL语句,它连接了两个表 SELECT TRIDENT.Maintenance.RCFAs.*, TRIDENT.Maintenance.Equipment.EquipmentName FROM TRIDENT.Maintenance.RCFAs LEFT JOIN TRIDENT.Maintenance.Equipment ON TRIDENT.Maintenance.Equipment.EquipmentId = TRIDENT.Maintenance.RCFAs.Equipme

我有这个SQL语句,它连接了两个表

SELECT TRIDENT.Maintenance.RCFAs.*, TRIDENT.Maintenance.Equipment.EquipmentName
FROM TRIDENT.Maintenance.RCFAs
LEFT JOIN TRIDENT.Maintenance.Equipment 
ON TRIDENT.Maintenance.Equipment.EquipmentId = TRIDENT.Maintenance.RCFAs.EquipmentId
WHERE 1 = 1
现在我必须引用第三个表,因为我有一个名为
components
的下拉列表,我们将使用它在名为
TRIDENT.Maintenance.RCFAXrefComponents
的表中查找内容。因此,如果从下拉列表中选择“螺栓”,它将查找年份和RCFAID,这为
RCFAXrefComponents
RCFAs
创建一个unqiue键,并在查找该年份和RCFAID时检查
RCFAs
中是否有任何行在
component
列中有“螺栓”。一位同事建议我使用IN子句检查年份和RCFAId是否在该
RCFAXrefComponents
中。他说这可能很棘手,但我对如何做到这一点有点迷茫

下面是
RCFAs
表,我想将年份和RCFAId值一起抓取,然后查找另一个,看看是否也有螺栓。然后,它应该在
RCFAs
表中调出行项目以输出给用户

这是下面的组件表

公共共享函数GetRCFAList(rcfaNumber为整数?,描述为字符串,
故障类型为字符串,设备描述为字符串,组件选择为字符串)为列表(RCFA)
Dim sql=“从TRIDENT.Maintenance.RCFAs中选择r.*,e.EquipmentName作为r左键,将TRIDENT.Maintenance.Equipment作为e左键,将e.EquipmentId=r.EquipmentId作为e左键,将TRIDENT.Maintenance.Equipment作为c左键,将c.EquipmentId=r.EquipmentId作为c右键,将c.Eyear=r.Year和c.RCFAId
如果失败类型为“”,则
sql+=“和RCFAs.FailureType=”&FailureType.ToUpper&“
如果结束
如果描述为“”,则
sql+=”和类似“%”的RCFAs.ShortDesc&description.ToUpper&“%”
如果结束
如果设备描述为“”,则
sql+=”和Equipment.EquipmentName类似“%”和equipmentDescription.ToUpper&“%”
如果结束
如果组件选择为“”,则
sql+=“c.ComponentId='%”和componentSelection.ToUpper&“%”
如果结束
Dim dbConn作为新的Trident.Core.DBConnection
Dim ds=dbConn.FillDataSet(sql)
Dim tmpList作为新列表(RCFA)
对于ds.Tables(0.Rows)中的每个dr As数据行
tmpList.Add(新的RCFA(新的Trident.Objects.Maintenance.RCFA.RCFA(dr)))
下一个
返回tmpList
端函数

我可能会感到困惑,但听起来您需要使用EXISTS

SELECT  r.*,
        e.EquipmentName
FROM    TRIDENT.Maintenance.RCFAs r
        LEFT JOIN TRIDENT.Maintenance.Equipment e ON e.EquipmentId = r.EquipmentId
WHERE   EXISTS ( SELECT 1
                 FROM   TRIDENT.Maintenance.RCFAXrefComponents c
                 WHERE  c.Year = r.Year
                        AND c.RCFAId = r.RCFAId
                        AND c.ComponentId LIKE '%BOLTS%' )

您可能不需要像“%BOLTS%”这样的
c.ComponentId
您可能只需要
c.ComponentId='BOLTS'
只需使用一个简单的
JOIN
RFCAXrefComponents
表,以及一个过滤组件ID的
WHERE
子句

SELECT r.*, e.EquipmentName
FROM TRIDENT.Maintenance.RCFAs AS r
LEFT JOIN TRIDENT.Maintenance.Equipment AS e
    ON e.EquipmentId = r.EquipmentId
JOIN TRIDENT.Maintenance.RCFAXrefComponents AS c
    ON c.Year = r.Year
    AND c.RCFAId = r.RCFAId
WHERE c.ComponentID = 'BOLTS'

不要粘贴模式和数据的屏幕截图。输入它。哦,好吧,我想这会更容易哦,好吧,如果我想获取RCFA中所有行项目,这些行项目在RCFAXref中有螺栓,这样它就会像更新的屏幕截图中那样,提取数据,我应该将嵌套语句中的SELECT 1替换为SELECT*对吗?SELECT 1和SELECT*会得到相同的结果。。EXISTS只查找找到的任何结果。试图在代码中实现此功能我用修订代码编辑了底部的帖子,但没有任何记录。如果每个选择框选择将其用作参数,则会将搜索参数附加到语句中。组件选择是我试图修复的最后一个组件。我试图在代码中实现这一点。我在底部用我的修订代码编辑了我的帖子,但没有任何记录。如果每个选择框选择将其用作参数,则会将搜索参数附加到语句中。组件选择是我试图修复的最后一个组件。您的SQL中可能有语法错误。如果填写了前3个搜索字段中的一个,SQL将显示
WHERE和
。尝试使用
结束初始SQL,其中1=1
。然后您可以安全地添加
。我尝试将sql语句粘贴到Microsoft sql Server Management Studio中,但也没有生成任何记录,但有4条记录使用了boltsCan,您对示例数据和所使用的查询进行了sqlfiddle处理?得到的结果BOLTS在数据库中是单数的,它被直接拉了上来
SELECT r.*, e.EquipmentName
FROM TRIDENT.Maintenance.RCFAs AS r
LEFT JOIN TRIDENT.Maintenance.Equipment AS e
    ON e.EquipmentId = r.EquipmentId
JOIN TRIDENT.Maintenance.RCFAXrefComponents AS c
    ON c.Year = r.Year
    AND c.RCFAId = r.RCFAId
WHERE c.ComponentID = 'BOLTS'