如何从主查询到子查询有一个 Link

how to have a Link from main query to sub query

我将两个值从一个 table 插入到另一个 table。插入的值之一来自连接三个列值。 我正在使用以下查询,但错误显示 "subquery has more than one value." 我们不能将 "top 1" 包含到子查询中,因为它给所有的值都相同。

insert into dbo.tblCrucibleLdgDtls (R2IGTNo,TotalMtrlWgt) 
Select  R2IGTNo,
   (select RTRIM(LTRIM(( CONCAT(ULTotalS1S2MtrlWgt,ULTotalS3S4MtrlWgt,ULTotalS5S6MtrlWgt)))) as TotalMtrlWgt 
    from dbo.tbl1RMWeighingDetails 
    where ULTotalS1S2MtrlWgt is not null or ULTotalS3S4MtrlWgt is not null or ULTotalS5S6MtrlWgt is not null 
   ) 
from dbo.tbl1RMWeighingDetails 
where  R2IGTNo like '%C%'

来自Table

解决方法可能很简单。 I am not a expert.There is no duplicates and (ULTotalS1S2MtrlWgt,ULTotalS3S4MtrlWgt,ULTotalS5S6MtrlWgt) 与 R2IGTNo 有独特的关系。就像如果 R2IGTNo 有 b1 那么 ULTotalS1S2MtrlWgt 有值,如果 R2IGTNo 有 b2 那么 ULTotalS3S4MtrlWgt 有值,如果 R2IGTNo 有 b3 那么 ULTotalS5S6MtrlWgt 有值。使用该条件查询可以更改。 请建议。

为 table 提供别名:

SELECT ..., (SELECT ... FROM  dbo.tbl1RMWeighingDetails wdA)
FROM  dbo.tbl1RMWeighingDetails wdB
...

现在 inner/nested 子查询可以引用 wdB,这将意味着 table.

的外部实例

而且,这看起来更适合使用 JOIN、APPLY 或窗口函数来完成。

解决方案取决于您从内部查询中获取的行类型。如果您的内部查询 returns 多个重复行,那么解决方案更简单,只需使用不同的 -

insert into dbo.tblCrucibleLdgDtls (R2IGTNo,TotalMtrlWgt) 
Select  R2IGTNo,
           (select distinct RTRIM(LTRIM((CONCAT(ULTotalS1S2MtrlWgt,ULTotalS3S4MtrlWgt,ULTotalS5S6MtrlWgt)))) as TotalMtrlWgt 
            from dbo.tbl1RMWeighingDetails 
            where ULTotalS1S2MtrlWgt is not null or ULTotalS3S4MtrlWgt is not null or ULTotalS5S6MtrlWgt is not null 
           ) 
from dbo.tbl1RMWeighingDetails 
where  R2IGTNo like '%C%'

但是如果您的内部查询 returns 多行彼此不同,那么您必须重新访问您的要求。

我用cte得到了答案,MS论坛得到了建议

insert into dbo.tblCrucibleLdgDtls (R2IGTNo,TotalMtrlWgt) 
    Select  R2IGTNo, coalesce(ULTotalS1S2MtrlWgt,ULTotalS3S4MtrlWgt,ULTotalS5S6MtrlWgt) as TotalMtrlWgt     from dbo.tbl1RMWeighingDetails     where  R2IGTNo like '%C%'

    with cte1 as(
select R2IGTNo,RTRIM(LTRIM(( CONCAT(ULTotalS1S2MtrlWgt,ULTotalS3S4MtrlWgt,ULTotalS5S6MtrlWgt)))) as TotalMtrlWgt 
        from dbo.tbl1RMWeighingDetails 
        where R2IGTNo like '%C%'
        and (ULTotalS1S2MtrlWgt is not null 
        or ULTotalS3S4MtrlWgt is not null 
        or ULTotalS5S6MtrlWgt is not null))
insert into dbo.tblCrucibleLdgDtls (R2IGTNo,TotalMtrlWgt) 
select * from cte1

总之谢谢大家。 -香卡