Sql server 如果没有要连接的记录,是否忽略SQL内部连接?

Sql server 如果没有要连接的记录,是否忽略SQL内部连接?,sql-server,tsql,inner-join,Sql Server,Tsql,Inner Join,我有以下几点 INNER JOIN @SynonymTable AS A ON ([Products].[Title] LIKE A.[Synonym]) @SynonymTable变量包含(如果需要)项列表,例如: %shirt% %blouse% %petticoat% 这些都是基于特定关键字搜索的同义词列表,例如术语“shirt”-从中我可以找到所有可能相关的项目,等等。问题是,如果没有提供关键字,查询显然不会连接任何内容 如果同义词表中没有项目,是否仍要消除联接或返回所有项目 我已经

我有以下几点

INNER JOIN @SynonymTable AS A ON ([Products].[Title] LIKE A.[Synonym])
@SynonymTable变量包含(如果需要)项列表,例如:

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

如果同义词表中没有项目,是否仍要消除联接或返回所有项目

我已经找到了一些帖子,比如,但是我无法让它在我的场景中工作


任何帮助或建议都很好。

使用两种不同的查询,检查
同义词表
是否有行,并使用
内部联接运行查询
否则从
产品
表返回行

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 

解决方案是不在同义词表上联接,而是在where子句中使用它

不是最优雅的代码,但应该可以工作(除非您有一个大的同义词表,否则它会变慢)


您可以使用如下所示的一种选择:

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)

我可能不明白这一点,但为什么不使用左外部联接呢?那么,如果表被填充,那么将返回错误的产品。我认为@Mithrandir是正确的:使用左联接,它将返回与提供的“同义词”匹配的所有记录另外,与联接字段NULLleft join不匹配的记录将提供产品中的所有记录,如果同义词中有记录,它将提供这2行或多行的信息。在查询运行之前,您是否可以检查
@SynonymTable
,查看是否有记录,如果没有,然后将
%
插入其中,以便查询将返回所有内容?回答得很好,我自己也会这样做,但是联接构成了一个更大查询的一部分,我无法分解它。
如果存在(从@SynonymTable中选择1)
将更有效。
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)