如何编写一个T-SQL查询来执行“like in”?

如何编写一个T-SQL查询来执行“like in”?,sql,tsql,Sql,Tsql,我需要编写以下伪代码的有效T-SQL查询版本: select * from newTable where [name] like in ( select [name] from oldTable ) 我不知道该怎么办。任何帮助,甚至引导我到一个现有的问题将是伟大的。谢谢 编辑: 根据一些评论,我将澄清这一特殊情况。这些表如下所示: oldTable code varchar(10) name varchar(500) newTable code varchar(10) name va

我需要编写以下伪代码的有效T-SQL查询版本:

select * from newTable where [name] like in (
    select [name] from oldTable
)
我不知道该怎么办。任何帮助,甚至引导我到一个现有的问题将是伟大的。谢谢

编辑: 根据一些评论,我将澄清这一特殊情况。这些表如下所示:

oldTable
code varchar(10)
name varchar(500)

newTable
code varchar(10)
name varchar(500)

在oldTable.code newTable.code出现的所有情况下,我想看看oldTable.name是否与newTable.name中的一个名称相似。基本上,一些新名称的开头或结尾添加了限定符。即:“旧名称”在新表中可能有一个“限定旧名称”。再次感谢。

我认为您只需删除以下内容:


从新表中选择*,其中[Name]在“从旧表中选择名称”中?嗯,你不能同时做一个喜欢和喜欢的动作

这看起来是SOUNDEX的一个很好的候选者

用SOUNDEX做一个连接


阅读这里:

假设两个表以某种方式相关

SELECT newTable.* FROM newTABLE JOIN oldTable ON <JOIN CRITERIA>
WHERE newTable.[Name] LIKE oldTable.name

我们自己也遇到了同样的问题。这可能对您不起作用,但我们提出的解决方案是: 选择[字段] 从[表] 其中[字段]类似于“条件1” 或类似“条件2”的[字段]


这不是一个很好的解决方案,但它对我们有效。

不太漂亮,但它有效:

选择不同的新表。* 来自newTABLE 联接旧表
在newTable上。名称与oldTable类似。名称

谢谢大家。我使用了下面的问题,灵感来自LukLed的回答和Stuart Ainsworth的评论

DECLARE @nt TABLE (NAME VARCHAR(10))
DECLARE @ot TABLE (NAME VARCHAR(10))

INSERT INTO @nt VALUES('Stuart')
INSERT INTO @nt VALUES('Ray')


INSERT INTO @ot VALUES('St%')
INSERT INTO @ot VALUES('Stu%')


SELECT *
FROM @nt n
WHERE EXISTS (SELECT *
                FROM @ot o
                WHERE n.name LIKE o.name)
SELECT DISTINCT old.code, old.name, new.name, new.code 
FROM newTable new 
JOIN oldTable old
ON new.name LIKE '%' + old.name + '%' 
WHERE new.code <> old.code
ORDER BY old.name, new.name
性能不是很好,但它是一次性的分析,可以完成工作


我之所以选择此版本而不是EXISTS版本,是因为它提供了新表和旧表的结果。

如果您使用很少使用的表,则可以轻松地执行此操作。 临时表声明从中窃取代码

2个表不需要有任何关系


这仅仅是一次暗中的尝试,但这让人想起了涉及非标量数据的情况。使用csv格式SQL Server 2005及以上版本的快速示例:

WITH oldTable ([name])
     AS
     (
      SELECT '003,006,009,012,015'
      UNION ALL
      SELECT '005,015'
     ),
     newTable ([name])
     AS
     (
      SELECT '007'
      UNION ALL
      SELECT '009'
      UNION ALL
      SELECT '015'
     )
SELECT N1.[name]
  FROM newTable AS N1
 WHERE EXISTS (
               SELECT * 
                 FROM oldTable AS O1
                WHERE ',' + O1.[name] + ','
                         LIKE '%,' + N1.[name] + ',%' 
              );

新老名字的一些相似和不相似的例子如何?你能给出一些样本数据吗;下面有几种解决方案可能有效,但很大程度上取决于数据的存储方式。@Aaron Palmer,您需要给出旧名称和新名称的实际示例,以及它们是否相似。旧的bbb与新的XBB匹配吗?老xyz和abc匹配吗?旧的abcxyz是否与abc等匹配。如果您不想给出示例,请给出查找匹配项的规则。@KM,对不起,我认为我的编辑已经足够清楚了。当我说喜欢时,我指的是喜欢的ANSI SQL定义。因此,旧bbb将匹配新XBB,旧abc将匹配新abcxyz,但旧abcxyz将不匹配新abc,旧xyz肯定不会匹配新abc。我希望这能为你消除一点困惑。我找到了一个适合我的解决方案,我把它贴在下面。我真的很感谢大家的回答。+1与join答案不同,这只会返回一条记录,尽管您可以使用join和select distinct,这取决于哪一条记录的性能更好。您真的认为OP在oldTable中存储了一个%吗。name??就像你的例子一样。我不知道OP是如何存储他的数据的,但他要求任何帮助。至少我的示例代码提供了一些要使用的示例数据:我忘了提到,如果有必要,您可以随时添加限定符;e、 g:其中n.name像“%”+o.name+“%”在我看来,这是您应该使用的唯一解决方案;它不会给你带来太多的好处,因为你会同时显示新旧列。如果新列在旧列上有多个匹配项,则会出现DISTINCT;在这种情况下,如果他们这样做了,您仍然在向他们展示:为什么交叉应用与交叉连接?旧版本的SQL Server以及其他RDBMS中将提供交叉连接。但也许我遗漏了一个微妙之处。+1,基于问题中缺乏信息,这是唯一可行的答案
WITH oldTable ([name])
     AS
     (
      SELECT '003,006,009,012,015'
      UNION ALL
      SELECT '005,015'
     ),
     newTable ([name])
     AS
     (
      SELECT '007'
      UNION ALL
      SELECT '009'
      UNION ALL
      SELECT '015'
     )
SELECT N1.[name]
  FROM newTable AS N1
 WHERE EXISTS (
               SELECT * 
                 FROM oldTable AS O1
                WHERE ',' + O1.[name] + ','
                         LIKE '%,' + N1.[name] + ',%' 
              );