我正在尝试使用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的值”错误。老实说,我可能使这种方式变得比需要的更加复杂,但是我已经盯着这些桌子了一段时间了。
我希望我能理解我要做的事情。
答案 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)