2011-06-13 60 views
1

我在生成查询时有疑问。在生成查询时需要帮助

这是在这两个

如最好的方法:1

DECLARE @SQLQuery varchar(MAX) 
SET @SQLQuery='Select tab1.Name,tab2.Name From table1 INNER JOIN table2 ON table2.ID=table1.ID' 

IF @Val=0 
SET @[email protected]+' where table1.ID>5' 
ELSE 
SET @[email protected]+' where table2.ID>5' 

例如,2:

IF @Val=0 
BEGIN 
Select tab1.Name,tab2.Name 
From table1 
INNER JOIN table2 
    ON table2.ID=table1.ID 
WHERE table1.ID>5 
END 
ELSE 
BEGIN 
Select tab1.Name,tab2.Name 
From table1 
INNER JOIN table2 
    ON table2.ID=table1.ID 
WHERE table2.ID>5 
END 
+2

您有什么评估“最佳”的标准? – APC 2011-06-13 06:48:28

+0

使用变量并执行查询或直接方法 – Navaneethan 2011-06-13 07:08:39

回答

1
Select tab1.Name,tab2.Name 
From table1 
INNER JOIN table2 
    ON table2.ID=table1.ID 
WHERE (@Val=0 AND table1.ID>5) OR (@Val!=0 AND table2.ID>5) 
0
IF @Val = 0 
BEGIN 
    Select T1.Name From 
    (
     Select Name From table1 Where Id > 5 
    )T1 
    INNER JOIN table2 T2 ON T2.ID = T1.ID 

END 
ELSE 
BEGIN 
    Select T2.Name From 
    (
     Select Name From table2 Where Id > 5 
    )T2 
    INNER JOIN table1 T1 ON T1.ID = T2.ID 
END 

通过这种方式,我们应该首先筛选值,然后在它们之间进行连接。

+0

优化程序应该足够聪明,以便按照何种顺序应用WHERE子句中的条件 - 尝试“强制”评估顺序,正如您在上面尝试的那样,可能不会工作,并且/或者可以将优化者的手联系起来做最好的工作(例如,如果表2中95%的行具有ID> 5,但在表1中总共只有6行,并且这些行仅匹配5%的行在Table2中,你希望它首先应用连接(它可能仍然会)) – 2011-06-13 08:02:54

+0

我认为,连接是按顺序执行的。当你说“优化器应该足够聪明,可以按照WHERE子句应用标准的顺序进行工作 - 尝试”强制“评估顺序”。谢谢你。你能分享链接吗?我想更多地了解这一点。 – Pankaj 2011-06-13 08:06:42