我对SQL非常陌生,并且以某种方式找到了需要我进行SQL的工作(不要躺在简历中)。无论如何,我正在尝试执行SELECT语句,我想在tableA中选择一个columnA,其中ColumnA中的单词存在于另一个tableB中,下面是我要实现的示例。
TableA, ColumnA : {Apple, Ball, Chair, Doll, Egg, Fan, Gun, Hat, Ink, Jug}
TableB, ColumnB : {Chair, Ball, Egg, Ink}
所以我试图提出我想要的声明,如下所示:
SELECT ColumnA FROM TableA
WHERE ColumnA = (SELECT ColumnB FROM TableB)
OR
SELECT ColumnA FROM TableA
WHERE ColumnA LIKE '%' + (SELECT ColumnB FROM TableB) + '%'
当然它不起作用,因为它将返回多个值。我在这方面还是一个新手,无法弄清楚如何使用CURSOR等功能。非常感谢您的帮助。谢谢。
(EDIT):因此从答案来看,同时使用IN和JOIN都可以解决我所需要的。非常感谢你。但是,我也想知道我需要使用LIKE的情况,假设columnA和columnB具有
ColumnA : {'This apple is red', 'This ball is round', 'This chair is metal'}
ColumnB : {'red', 'round'}
因此,我想显示columnA中具有columnB中存在的关键字的数据。我在想唯一的方法是组合通配符并从columnB中选择。非常感谢您的帮助,谢谢。
答案 0 :(得分:2)
sql server 2016 及更高版本,您可以在这种情况下使用string_split
函数。
select * from tableA t1
cross apply string_split(t1.ColumnA, ',') t2
where t2.Value in
(select t2.value from tableB t1
cross apply string_split(t1.ColumnB, ',') t2)
请参见dbfiddle。
对于 sql server 2014 ,我们需要使用具有string
函数的递归查询。
with cte as
(
select
left(ColumnA, charindex(',', ColumnA + ',') - 1) as col1 ,
stuff(ColumnA, 1, charindex(',', ColumnA + ','), '') as col2
from tableA
union all
select
left(col2, charindex(',', col2 + ',') - 1),
stuff(col2, 1, charindex(',', col2 + ','), '')
from cte
where
col2 != ''
), cte2 as
(
select
left(ColumnB, charindex(',', ColumnB + ',') - 1) as col1 ,
stuff(ColumnB, 1, charindex(',', ColumnB + ','), '') as col2
from tableB
union all
select
left(col2, charindex(',', col2 + ',') - 1),
stuff(col2, 1, charindex(',', col2 + ','), '')
from cte2
where
col2 != ''
)
select * from cte where rtrim(ltrim(col1)) in (select rtrim(ltrim(col1)) from cte2)
option (maxrecursion 0);
请参见dbfiddle。
答案 1 :(得分:1)
.js
或(最好做)
SELECT ColumnA FROM TableA
WHERE ColumnA IN (SELECT ColumnB FROM TableB)
答案 2 :(得分:1)
尝试一下
metrics=["accuracy"]