如果没有要加入的记录,请忽略SQL INNER JOIN?

时间:2013-01-03 14:15:50

标签: sql-server tsql inner-join

我有以下加入

INNER JOIN @SynonymTable AS A ON ([Products].[Title] LIKE A.[Synonym])

@SynonymTable表变量包含(如果需要)项目列表,例如:

%shirt%
%blouse%
%petticoat%

这些都基于特定关键字搜索的同义词列表,例如术语“衬衫” - 从中​​我可以找到所有可能相关的项目等。问题是,如果有没有提供关键字,查询显然不会加入任何内容。

如果同义词表中没有项目,有没有消除连接或返回所有项目?

我找到了诸如Bypass last INNER JOIN in query这样的帖子但是我无法让它适合我的情景?

任何帮助或建议都会很棒。

3 个答案:

答案 0 :(得分:7)

您可以使用以下选项之一:

SELECT * FROM Products 
LEFT JOIN @SynonymTable AS A ON ([Products].[Title] LIKE A.[Synonym])
WHERE A.[Synonym] IS NOT NULL 
      OR NOT EXISTS (SELECT B.[Synonym] FROM @SynonymTable B)

答案 1 :(得分:4)

使用两个不同的查询,检查synonymtable是否有行并使用inner join运行查询,否则从products表返回行

IF EXISTS (SELECT * FROM @SynonymTable)
BEGIN
  SELECT * FROM Products 
  INNER JOIN @SynonymTable AS A ON ([Products].[Title] LIKE A.[Synonym])
END
ELSE
  SELECT * FROM Products 

答案 2 :(得分:1)

解决方案是不加入同义词表,而是在where子句

中使用它

不是最优雅的代码,但应该有效(除非你有一个很大的同义词表,然后它会变慢)

where ((select count(1) from @SynonymTable) = 0 or 
       (select count(1) from @SynonymTable 
        where [Products].[Title] LIKE @SynonymTable.[Synonym]) > 0 ))