SQL 之Where条件与From表无关性例子

本文介绍了如何通过SQL查询找出上期结账的老物料存货余额,并将其导入到新物料存货中,同时进行存货余额的调整。通过使用LEFT JOIN和条件查询,确保了操作的有效性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--------查询出上期结账的老物料存货余额,导入到新物料存货中去并将老物料存货余额调平。----------
Select S1.NumAtCrd  , S1.CrdID  , S1.ItmID , TB1.ItmName , TB1.ItmSpec , TB1.Serials , S1.WhsID , S1.LineSumFC  , S1.FreeTxt
From(
	Select CONVERT(varchar(100), GETDATE(), 112) AS NumAtCrd , 'A05' CrdID , @OldItmID ItmID, WhsID , -EndAmount LineSumFC , 
		'关闭物料,原始物料存货余额调平' FreeTxt
	From AAFinWh
	Where ItmID = @OldItmID AND 1 = ISNULL(                --检查OldItmID是否可用
			(select top 1 1 from MDItm T0 where T0.ItmID = @OldItmID and @OldItmID <> @NewItmID and T0.IsClose = 'N') , 2) AND 
		1 = ISNULL(
		 (select top 1 1 from MDItm T0  where T0.ItmID = @NewItmID and T0.IsClose = 'N') , 2)  -- 检查新物料是否可用
	Group by AbsID , WhsID , EndAmount
	Having AbsID = (Select Max(AbsID) From AAFinWh Where ItmID = @OldItmID) 
	UNION ALL
	Select CONVERT(varchar(100), GETDATE(), 112) AS NumAtCrd , 'A05' CrdID , @NewItmID ItmID, TB1.WhsID , Sum(EndAmount) LineSumFC ,
		'关闭物料的存货余额,调至新物料中' FreeTxt
	From AAFinWh TD1
	LEFT JOIN MDItm TB1 ON TD1.ItmID = TB1.ItmID
	Where TD1.ItmID = @OldItmID AND 1 = ISNULL(                --检查OldItmID是否可用
			(select top 1 1 from MDItm T0 where T0.ItmID = @OldItmID and @OldItmID <> @NewItmID and T0.IsClose = 'N') , 2) AND 
		1 = ISNULL(
		 (select top 1 1 from MDItm T0  where T0.ItmID = @NewItmID and T0.IsClose = 'N') , 2) -- 检查新物料是否可用
	Group by TD1.AbsID , TB1.WhsID
	Having TD1.AbsID = (Select Max(AbsID) From AAFinWh Where ItmID = @OldItmID)
)S1 
LEFT JOIN MDItm TB1 ON S1.ItmID = TB1.ItmID


查询中,如何去检查老物料是否可用,新物料是否可用。可用LEFT JOIN 去左连AAFinWh,但万一要查的XX表与AAFinWh没有关系,此时的LEFT JOIN 是没有效率的。

显然用 1 = Select Top 1 1 From XX Where YY = ZZ 这样的类似条件去限制 将会更有效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值