【问题标题】:Query SQL with like operator from two tables使用like运算符从两个表中查询SQL
【发布时间】:2010-01-21 09:12:21
【问题描述】:

如何使用like 运算符从两个不同的表中执行 SQL 查询?

我需要类似的东西:

select * from table1 where name like %table2.name

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

【问题讨论】:

  • 您在问题中包含的信息越多,答案就越好。这个问题为人们提供的信息很少。
  • 是 SQL Server 还是 MySQL?两个都?您的问题最初仅被标记为 SQL Server。
  • 这是 sql server...对不起!

标签: sql sql-server sql-like


【解决方案1】:

编辑

(原来的答案在下面)

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

为此,您可以使用LIKE 作为连接中ON 子句的一部分:

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,添加各种分号,去掉GOs,改用...LIKE concat('%', b.bar)。)

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

one
tone
phone

如果您可以将运算符存储在b.bar 中,则无需执行 concat。

另外,我惊讶地发现这也适用(在 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'

这将为您提供来自someTablefoo 和来自someOtherTablebar,其中行由someFieldfoo 以“SOMETHING”开头,bar以“SOMETHING ELSE”结尾.

【讨论】:

  • 我需要类似:select * from table1 where name like %table2.name
【解决方案2】:

不太确定确切的语法,但这里有一个想法:

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

【讨论】:

  • 你的别名是F,所以应该是R.F like,而不是R.Foo like
  • @Peter:谢谢!更正了。
  • 我不是这个意思!!我需要类似: select * from table1 where name like %table2.name
  • 将过滤器放在个人选择上会更好吗?您正在创建一个潜在的巨大结果集作为联合,然后才进行过滤。如果您先过滤,该语句将不那么复杂(消除 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'
  • @simone:如果是这样,这不是我的错。您应该在原始问题中更加准确。 GIGO 的辉煌 :)
【解决方案3】:

基于@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多