请求实现T-SQL多库多表特定条件的合同查询语句
我帮你梳理了符合需求的T-SQL查询方案,分单表和多表/多数据库两种场景来实现,逻辑和你提到的C#判断逻辑一致,但直接在数据库层完成判断更高效:
单表场景查询语句
假设你的合同数据存储在单个表中,下面的查询可以直接满足需求:
DECLARE @zavodId INT = 5; -- 注意:如果UstrojstvenaJedinicaId是字符串类型,请改成VARCHAR对应长度 SELECT * FROM YourContractTable WHERE IsDeleted = 0 AND ( -- 第一种情况:匹配传入的车间ID参数 UstrojstvenaJedinicaId = @zavodId OR -- 第二种情况:系统里仅存在唯一的设备单元ID,且该ID为'HCPHS' EXISTS ( SELECT 1 FROM ( -- 先提取所有未删除合同的唯一设备单元ID SELECT DISTINCT UstrojstvenaJedinicaId FROM YourContractTable WHERE IsDeleted = 0 ) AS DistinctUnits -- 判断唯一ID的数量为1,且值是'HCPHS' HAVING COUNT(*) = 1 AND MAX(UstrojstvenaJedinicaId) = 'HCPHS' ) );
逻辑说明
- 当系统中存在多个不同的
UstrojstvenaJedinicaId时,只会返回IsDeleted=0且UstrojstvenaJedinicaId等于@zavodId的合同; - 当系统里所有未删除合同的
UstrojstvenaJedinicaId只有一个且是'HCPHS'时,会返回所有未删除的合同。
多数据库/多表场景查询语句
如果合同数据分散在多个数据库或多张表中,可以先用CTE把所有数据源整合起来,再应用相同的条件判断:
DECLARE @zavodId INT = 5; -- 注意:根据UstrojstvenaJedinicaId的实际类型调整参数类型 WITH AllContracts AS ( -- 整合多个数据源的合同数据,确保所有子查询的列数量、类型完全一致 SELECT UstrojstvenaJedinicaId, IsDeleted, ContractId, ContractName /* 其他需要的业务列 */ FROM DB1.dbo.ContractTable UNION ALL SELECT UstrojstvenaJedinicaId, IsDeleted, ContractId, ContractName /* 其他需要的业务列 */ FROM DB2.dbo.ContractTable -- 继续添加更多数据库/表... ) SELECT * FROM AllContracts WHERE IsDeleted = 0 AND ( UstrojstvenaJedinicaId = @zavodId OR EXISTS ( SELECT 1 FROM ( SELECT DISTINCT UstrojstvenaJedinicaId FROM AllContracts WHERE IsDeleted = 0 ) AS DistinctUnits HAVING COUNT(*) = 1 AND MAX(UstrojstvenaJedinicaId) = 'HCPHS' ) );
注意事项
- 使用
UNION ALL时,务必保证所有子查询返回的列数量、数据类型完全匹配; - 如果
UstrojstvenaJedinicaId是字符串类型(比如VARCHAR(20)),记得同步修改@zavodId的类型,避免类型转换错误; - 相比在C#应用层先判断再执行不同查询的方式,这个方案把判断逻辑直接放到数据库层,减少了应用层与数据库的交互次数,性能更优。
内容的提问来源于stack exchange,提问作者user7512602
相关产品推荐
相关产品推荐

