2011-06-13 65 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