2013-07-05 108 views
5
USE tempdb 

CREATE TABLE A 
(
    id INT, 
    a_desc VARCHAR(100) 
) 

INSERT INTO A 
VALUES (1, 'vish'),(2,'hp'),(3,'IBM'),(4,'google') 

SELECT * FROM A 

CREATE TABLE B 
(
    id INT, 
    b_desc VARCHAR(100) 
) 

INSERT INTO B 
VALUES (1, 'IBM[SR4040][SR3939]'),(2,'hp[GR3939]') 

SELECT * FROM B 

SELECT * 
FROM A 
WHERE a_desc LIKE (SELECT b_desc FROM B) -- IN with LIKE problem here 

所有时间结束字符串在表B中都不相同所以我不能使用修剪方法来删除特定字符并在In子句中匹配。使用[like]像在SQL中的子句?

- 上面扔错误子查询返回的多个值

- 我只是举例目的,我创建了这个例子

两个表中1000行
--excepted output 
--IBM 
--hp 

--from一表

+1

有已经是几个这样的问题:http://stackoverflow.com/questions/15735117/using-like-and-in-and-a-subquery-in-a-single-sql-statement - HTTP://计算器。 COM /问题/ 10618912 /样使用,子查询 - 返回 - 多行 - http://stackoverflow.com/questions/2528858/with-sql-can-you-use-a-sub-query-in-a- where-like-clause –

回答

5

尝试这一个 -

查询:

SELECT * 
FROM A 
WHERE EXISTS(
    SELECT 1 
    FROM B 
    WHERE b_desc LIKE '%' + a_desc + '%' 
) 

输出:

id   a_desc 
----------- ---------- 
2   hp 
3   IBM 

执行计划:

proff

扩展统计:

stat

更新:

SELECT A.*, B.* 
FROM A 
OUTER APPLY (
    SELECT * 
    FROM B 
    WHERE b_desc LIKE '%' + a_desc + '%' 
) B 
WHERE b_desc IS NOT NULL 
+1

为了更好地理解执行计划,请阅读以下简短手册:http://sqlmag.com/t-sql/understanding-query-plans – Devart

+0

是否有可能从列表B中的A列表中选择列表? –

+1

请参阅最新的答案。 – Devart

3

你可以简单的加入:

SELECT distinct a.* 
from A inner join b on b.b_desc like '%' + a.a_desc + '%' 
3

试试这个,这会给你确切的输出

select distinct a.a_desc 
from A r 
join B b 
on b.b_desc like a.a_desc +'%' 
1
SELECT * 
FROM A , B 
WHERE a_desc LIKE '%' + b_desc + '%'