2009-08-11 24 views

回答

6

在參數傳遞= 1到工會,別的只返回的第一個結果集:

select field1, field2, ... from table1 where cond 
union 
select field1, field2, ... from table2 where cond AND param = 1 
+0

你打了我一分鐘...... +1 – 2009-08-11 18:45:00

+0

當問題出現時,我實際上是在做那種查詢:) – chris 2009-08-11 19:07:30

+0

太簡單了,但我無法想出它。謝謝。 – 2009-08-11 19:11:24

2

如果他們都是完全相同的結構,那麼爲什麼不能有一個參數區別於單個表兩張桌子?在這一點上,對於您收到的結果集的參數,它變成一個簡單的案例陳述。

第二個選擇是雙重結果集。您可以從存儲過程中選擇多個結果集。然後在代碼中,您可以使用DataReader.NextResult或DataSet.Tables(1)來獲取第二組數據。然後,將代碼的責任放在同一個集合中或合併兩個表。

第三種可能性是利用IF聲明。說,在通過一個整數與1,2,3預期可能的值,然後沿此在實際存儲的過程代碼東西

if @Param = 1 Then 
    Select From Table1 
if @Param = 2 THEN 
    Select From Table2 
if @Param = 3 Then 
    Select From Table1 Union Select From Table 2 

第四種可能性是具有兩個不同的過程之一,其運行工會和一個沒有,然後使它的代碼的責任,以確定哪一個要調用基於該參數,如:

myCommandObject.CommandText = IIf(myParamVariable = true, "StoredProc1", StoredProc2") 
+0

第二個表格用於特殊情況,可能很大,因此不能將其與第一個表格合併。 客戶期望單個結果集,我計劃對其進行更改。我想在數據庫端處理這個問題。 Case語句處理很多情況。我正在查看是否可以使用Case, – 2009-08-11 18:50:36

+0

..我不打算改變它.. – 2009-08-11 18:51:06

1

這很容易。

/* Always return tableX */ 
select colA, colB 
from tableX 
union 
select colA, colB 
from tableY 
where @parameter = 'IncludeTableY' /* Will union with an empty set otherwise */ 

如果這不是立即顯而易見(通常不是),請考慮下面的示例。要記住的主要事情是,如果where子句對於某行的計算結果爲true,則會返回,否則將被丟棄。

這總是評估爲真,所以每一行都會返回。

select * 
from tableX 
where 1 = 1 

這總是評估爲false,因此沒有行返回(有時用作快速和髒的get-me-the-column查詢)。

select * 
from tableX 
where 1 = 0 
0

這無論從表中返回值,這取決於你的參數傳遞一個值上

select field1, field2, ... from table1 where @p1 is null 
union 
select field1, field2, ... from table2 where @p1 is not null 

你只需要添加您的標準,其餘爲where子句

0

使用視圖。

CREATE view_both AS SELECT *,1 AS源 FROM表1 UNION ALL SELECT *,2 AS源 FROM table2中

SELECT * FROM view_both WHERE源< @source_flag

優化根據來源確定要使用哪一個或兩個表,而不要求索引它。