我需要编写以下伪代码的有效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中的名字之一。基本上,一些新名称已将限定符添加到名称的开头或结尾。即:“旧名称”可能在newTable中具有“合格的旧名称”。再次感谢。
答案 0 :(得分:6)
假设两个表以某种方式相关。
SELECT newTable.* FROM newTABLE JOIN oldTable ON <JOIN CRITERIA>
WHERE newTable.[Name] LIKE oldTable.name
答案 1 :(得分:5)
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)
答案 2 :(得分:2)
不太好,但它确实有效:
SELECT DISTINCT newTable。*
来自newTABLE
加入oldTable
ON newTable。“Name”LIKE oldTable.name
答案 3 :(得分:1)
我认为你只需删除类似的内容,例如:
从newTable中选择*,其中[Name] in(从oldTable中选择名称)
答案 4 :(得分:1)
谢谢大家。我使用了以下查询,灵感来自LukLed的回答和Stuart Ainsworth的评论。
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”版本的原因是因为它给了我新旧表格的结果。
答案 5 :(得分:0)
姓名如何?好吧,你不能同时做一个LIKE和IN。
这看起来像SOUNDEX的好候选人
使用SOUNDEX进行加入。
在此处阅读:http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx
答案 6 :(得分:0)
我们自己遇到了同样的问题。它可能对您不起作用,但我们提出的解决方案是:
SELECT [Fields]
FROM [Table]
WHERE [Field] like 'Condition1'
OR [Field] like 'Condition2'
不是一个很好的解决方案,但它适用于我们。
答案 7 :(得分:0)
如果您使用极少使用cross apply
,则可以轻松完成此操作
(来自Stuart的临时表声明被盗代码)
2个表格不需要与Matthews' answer有任何关系。
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 distinct n.NAME
from @nt n
cross apply @ot o
where n.NAME like o.name
答案 8 :(得分:0)
仅仅在黑暗中刺伤,但这非常让人联想到涉及非标量数据的情况。使用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] + ',%'
);