从两个表中使用like运算符查询SQL

6

如何使用 like 操作符从两个不同的表中进行 SQL 查询?

我需要类似于以下的查询语句:

select * from table1 where name like %table2.name

这不是一个普通的字段,而是另一张表中字段的子字符串。


你在问题中提供的信息越多,得到的答案就会越好。这个问题提供的信息非常少,让人们难以处理。 - T.J. Crowder
是SQL Server还是MySQL?两个都有吗?你最初的问题只标记了SQL Server。 - T.J. Crowder
抱歉,这是SQL Server。 - simone
3个回答

4

编辑

你的评论(以及后来的编辑)完全改变了问题。

为此,您可以在连接的ON子句中使用LIKE

CREATE TABLE a (foo varchar(254))
GO

CREATE TABLE b (id int, bar varchar(254))
GO

INSERT INTO a (foo) VALUES ('one')
INSERT INTO a (foo) VALUES ('tone')
INSERT INTO a (foo) VALUES ('phone')
INSERT INTO a (foo) VALUES ('two')
INSERT INTO a (foo) VALUES ('three')

INSERT INTO b (id, bar) VALUES (2, 'ne')
INSERT INTO b (id, bar) VALUES (3, 't')

SELECT a.foo
FROM a
INNER JOIN b ON a.foo LIKE '%' + b.bar
WHERE b.id = 2

(这是SQL Server版本; 对于MySQL,请添加各种分号,删除GO,并使用...LIKE concat('%', b.bar)。)

它使用id=2在表b中查找bar="ne",然后在其前面添加%运算符,并将其用于过滤来自a的结果。结果如下:

one
tone
phone

如果您可以将运算符存储在b.bar中,则无需进行连接操作。

另外,我很惊讶地发现这也适用于 SQL Server:

SELECT foo
FROM a
WHERE foo LIKE (
    SELECT TOP 1 '%' + bar
    FROM b
    WHERE id = 2
)

然而使用JOIN的版本可能更加灵活。

这应该可以让你开始了。

原始答案

(可以说不再相关)

很难确定你在问什么,但这里有一个使用LIKE来限制从JOIN中结果的示例:

SELECT a.foo, b.bar
FROM someTable a
INNER JOIN someOtherTable b
    ON a.someField = b.someField
WHERE a.foo LIKE 'SOMETHING%'
AND b.bar LIKE '%SOMETHING ELSE'

这将从someTable中获取foo,从someOtherTable中获取bar,这些行由someField相关联,并且foo以"SOMETHING"开头,bar以"SOMETHING ELSE"结尾。


我需要类似以下的东西:select * from table1 where name like %table2.name - simone

3

我不确定具体的语法,但这是一个想法:

select ... from (
    select ID, Foo as F from FooTable
    union all
    select ID, Bar as F from BarTable) R
where R.F like '%text%'

1
你的别名是 F,所以应该是 R.F like,而不是 R.Foo like - Peter Lang
这不是我想要的!!我需要像这样的东西:select * from table1 where name like %table2.name - simone
你把筛选器放在各个选择上会更好吗?你正在创建一个可能非常庞大的结果集,然后再进行过滤。如果您首先进行筛选,则语句将更简单(消除SELECT),我认为它会执行得更快:SELECT ID, Foo as F FROM FooTable WHERE Foo LIKE '%text%' UNION ALL SELECT ID, Bar as F FROM BarTable WHERE Bar LIKE '%text' - T.J. Crowder
不,这只是过滤另一个表中子字符串的内容。 - simone
1
@simone:如果是这样,那不是我的错。您在最初的问题中应该更加精确。垃圾输入导致错误输出 :) - Anton Gogolev

2

根据@TJCrowder的回答

测试表格

create table #A (
id varchar(10)
)


create table #b(
number varchar(5)
)

insert into #A values('123')
insert into #A values('456')
insert into #A values('789')
insert into #A values('0123')
insert into #A values('4567')

select * from #A

insert into #B values('12')
insert into #b values('45')
insert into #b values('987')
insert into #b values('012')
insert into #b values('666')

实际查询

select * from #a, #b
where #a.id like '%' + #b.number + '%'

将上述查询根据您的需要进行修改,例如:
select #A.* from #A,#B ...
or
select * from #a, #b
where #a.id like  #b.number + '%'  -- one side match

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接