只有当记录存在时,t-sql才会在表上包含内连接

时间:2014-12-19 10:59:04

标签: sql sql-server tsql join

我有一张非常大的桌子,有大量的记录。

[HugeTable](id, col1, col2, col3...)

前端应用程序上有一个页面显示基于许多过滤器的[HugeTable]数据。其中一个过滤器将给出[HugeTable]的子集,如果不为空

#HugeTable_subset(id)

如果存在此过滤器,#HugeTable_subset将有记录。我想将[HugeTable]数据缩小到仅匹配#HugeTable_subset中的记录。

所以现在,在t-sql中,我正在进行if-else类型的查询

IF (SELECT Count(*) FROM #HugeTable_subset) > 0
    BEGIN
        SELECT HugeTable.* FROM [HugeTable] h
        JOIN #HugeTable_subset  t
        ON h.id = t.id
        WHERE h.params = @searchParams
    END
ELSE
    BEGIN
        SELECT * FROM [HugeTable] h
        WHERE h.params = @searchParams
    END

有没有办法可以将这两个选项合并为一个?

2 个答案:

答案 0 :(得分:1)

要将两个选项合二为一,您可以使用 LEFT OUTTER JOIN 而不是 INNER JOIN 。 你可能已经知道了,是的,也许你不知道你已经以最优化的方式做到了。 sql-server ill为IF-ELSE中的每个选择创建两个子查询计划,并正确使用它们。

你可以用酸来测试它是否有任何差别,以及IF-ELSE是否真的击败LEFT JOIN选项

此外,还有两点我可以指出。

1)过滤器上的良好索引可以真正提高您的性能。

2)您可以使用分页返回一些结果,在结果返回大量记录时提高性能和用户体验

答案 1 :(得分:0)

    SELECT HugeTable.* FROM [HugeTable] h
    WHERE ((SELECT Count(*) FROM #HugeTable_subset) = 0) OR 
           h.id IN (SELECT t.id from #HugeTable_subset  t))