尝试插入时“子查询返回多个值”

时间:2019-06-11 14:41:32

标签: tsql

我正在尝试使用TSQL将属于另一表中另一列的一部分的列插入到表中,但是出现错误,指出当我将该子查询用作表达式时返回了多个值。我知道导致错误的原因,但我似乎想不出一种方法来使它产生我想要的东西。

我正在尝试做类似的事情:

A.Base      B.Reference  C.Wanted
---         ----         ----
abcdaa      aa           abcdaa
bcdeab      bb           cdefbb
cdefbb      cc           efghcc
defgbc      ddd          fghddd
efghcc
fghddd

所以我正在使用代码:

INSERT INTO C ( [Some other column], Wanted )
SELECT 
    A.[Some other column], 
    , CASE
        WHEN LEN( B.Reference ) = 2 THEN
            ( SELECT A.Base FROM A WHERE RIGHT( A.Base, 2 ) = 
                ( SELECT B.Reference FROM B WHERE LEN( B.Reference ) = 2 )
            )
        WHEN LEN( B.Reference ) = 3 THEN
            ( SELECT A.Base FROM A WHERE RIGHT( A.Base, 3 ) = 
                ( SELECT B.Reference FROM B WHERE LEN( B.Reference ) = 3 )
            )
    END
FROM 
    A
    , B

哪个会返回“大于1的值”错误。老实说,我可能使这种方式变得比需要的更加复杂,但是我已经盯着这些桌子了一段时间了。

我希望我能理解我要做的事情。

3 个答案:

答案 0 :(得分:0)

如果您知道记录不是重复的,并且您确定在A和B作品之间进行JOIN(如Martin所述),您是否不能仅选择“ distinct”(唯一)来返回唯一记录?

答案 1 :(得分:0)

我会这样尝试:

-使用声明的表变量和测试数据创建样机

DECLARE @tblA TABLE(someColumnInA VARCHAR(100));
DECLARE @tblB TABLE(someColumnInB VARCHAR(100));
DECLARE @tblC TABLE(someColumnInC VARCHAR(100));

INSERT INTO @tblA VALUES
 ('abcdaa')   
,('bcdeab') 
,('cdefbb')   
,('defgbc')  
,('efghcc')
,('fghddd')

INSERT INTO @tblB VALUES
 ('aa')          
,('bb')          
,('cc')          
,('ddd');

-查询

INSERT INTO @tblC(someColumnInC)
SELECT SomeColumnInA
FROM @tblA a
WHERE EXISTS(SELECT 1 FROM @tblB b WHERE a.someColumnInA LIKE '%' + b.SomeColumnInB + '%');

SELECT * FROM  @tblC;

简而言之:

创建样机(请提前下一次执行此操作)后,只要存在任何值,我们都会使用查询将@tblA中的所有值插入@tblC@tblB中的值,它是@tblA中当前值的一部分。

答案 2 :(得分:0)

如何做这样的事情?

select *
from A
where RIGHT(A.Base,2) IN (select B.Reference FROM B WHERE LEN(B.Reference) = 2)

UNION ALL

select *
from A
where RIGHT(A.Base,3) IN (select B.Reference FROM B WHERE LEN(B.Reference) = 3)