Sql server 关于新T-SQL格式的建议

Sql server 关于新T-SQL格式的建议,sql-server,tsql,Sql Server,Tsql,我们最近已从SQL Server 2008 R2迁移到SQL Server 2017 web版。 我不是SQL开发人员,但热衷于学习 由于我们的许多脚本都是旧的SQL格式,我正在寻找一些替代方法来利用新的T-SQL格式来帮助优化代码 下面是一个例子,我相信可以用一些不同的方法来修改。 如果有人建议我一些方法,以便我能详细了解它们,这将对我很有帮助 下面的查询是针对使用UNION ALL的报告,第一部分获取的ID数据被错误地标记为“补偿”,第二部分获取的ID数据与需要完成的付款金额相同 SELEC

我们最近已从SQL Server 2008 R2迁移到SQL Server 2017 web版。 我不是SQL开发人员,但热衷于学习

由于我们的许多脚本都是旧的SQL格式,我正在寻找一些替代方法来利用新的T-SQL格式来帮助优化代码

下面是一个例子,我相信可以用一些不同的方法来修改。 如果有人建议我一些方法,以便我能详细了解它们,这将对我很有帮助

下面的查询是针对使用UNION ALL的报告,第一部分获取的ID数据被错误地标记为“补偿”,第二部分获取的ID数据与需要完成的付款金额相同

SELECT TOP 200 'Recoup',ERH_DOC_DATE,ERH_DOCNO,ERH_RECV_FROM,ERD_BLH_ID,BLD_CODE,A.ERD_ALLOWED_AMT,A.ERD_PAID_INS_AMT
FROM TRN_ERA_HEAD,TRN_ERA_DET A,TRN_BILLING_DET
WHERE ERH_STATUS = 'P' AND ERH_BOOL_INACTIVE = 0 AND A.ERD_BOOL_RECALLED=1 AND
A.ERD_ALLOWED_AMT <> 0 AND A.ERD_PAID_INS_AMT <> 0 AND
ERH_ID = A.ERD_ERH_ID AND
A.ERD_BLD_ID = BLD_ID AND
NOT EXISTS (SELECT B.ERD_ID FROM TRN_ERA_DET B WHERE A.ERD_ERH_ID = B.ERD_ERH_ID AND A.ERD_ID <> B.ERD_ID AND B.ERD_BLD_ID = A.ERD_BLD_ID AND B.ERD_BOOL_RECALLED = 0 AND A.ERD_ALLOWED_AMT = B.ERD_ALLOWED_AMT AND A.ERD_PAID_INS_AMT = B.ERD_PAID_INS_AMT)
AND ERH_DOC_DATE>='01-01-2021' AND ERH_DOC_DATE<='05-31-2021' 
UNION ALL 
SELECT TOP 200 'Payment',EH1.ERH_DOC_DATE,EH1.ERH_DOCNO, EH1.ERH_RECV_FROM, ED1.ERD_BLH_ID,BD1.BLD_CODE,ED1.ERD_ALLOWED_AMT, ED1.ERD_PAID_INS_AMT FROM 
( SELECT ERD_ERH_ID ERDERH_ID, ERD_BLH_ID erdblh_id, a.erd_bld_id bld, A.ERD_ALLOWED_AMT, A.ERD_PAID_INS_AMT FROM TRN_ERA_HEAD,TRN_ERA_DET A,TRN_BILLING_DET WHERE ERH_STATUS = 'P' AND ERH_BOOL_INACTIVE = 0 AND A.ERD_BOOL_RECALLED=1 AND A.ERD_ALLOWED_AMT <> 0 AND A.ERD_PAID_INS_AMT <> 0 AND ERH_ID = A.ERD_ERH_ID AND A.ERD_BLD_ID = BLD_ID AND NOT EXISTS 
(SELECT B.ERD_ID FROM TRN_ERA_DET B WHERE A.ERD_ERH_ID = B.ERD_ERH_ID AND A.ERD_ID <> B.ERD_ID AND B.ERD_BLD_ID = A.ERD_BLD_ID AND B.ERD_BOOL_RECALLED = 0 AND A.ERD_ALLOWED_AMT = B.ERD_ALLOWED_AMT AND A.ERD_PAID_INS_AMT = B.ERD_PAID_INS_AMT) AND ERH_DOC_DATE>='01-01-2021'
AND ERH_DOC_DATE<='05-31-2021') AS RECOUPS, 
TRN_ERA_HEAD EH1,TRN_ERA_DET ED1, TRN_BILLING_DET BD1 WHERE RECOUPS.ERDERH_ID < ED1.ERD_ERH_ID AND ED1.ERD_BLD_ID = RECOUPS.BLD AND EH1.ERH_ID=ED1.ERD_ERH_ID AND ED1.ERD_BLD_ID=BD1.BLD_ID AND EH1.ERH_TRNTYPE='IN' AND EH1.ERH_STATUS = 'P' AND EH1.ERH_BOOL_INACTIVE = 0 AND ED1.ERD_BOOL_RECALLED=0 AND ED1.ERD_ALLOWED_AMT <> 0 AND ED1.ERD_PAID_INS_AMT <> 0;
请给我一些不同的建议。
提前谢谢你。

Hmmm,既然你已经有了一些行之有效的方法,也许提出这样一个问题的最好地方就是谢谢你的建议@George MenoutisEvolve!任何人都不应该使用。对你的查询进行一点格式化会鼓励其他人查看它。在没有ORDERBY子句的情况下使用TOP通常是一个逻辑缺陷。从正确设置代码墙的格式开始,它是不可读的,空白是不需要花费的。建议:不要使用老式的交叉连接,而是使用正确的连接语法。不要使用像A和B这样的别名,而是选择一些值得纪念的东西。不要使用不可读的表名,让它们变得明显。不需要子查询时,不要进行子查询。使用半开区间>=和,使用公共表表达式而不是子查询,并寻找消除重复子查询的机会。