簡體   English   中英

可以選擇在T-SQL中使用另一個表中的UNION而不使用臨時表或動態sql?

[英]Optionally use a UNION from another table in T-SQL without using temporary tables or dynamic sql?

我有兩個具有相同結構的sql server表。 在存儲過程中,我從第一個表中選擇了一個。 偶爾我想根據傳入的參數從第二個表中進行選擇。

我想要一種方法來做到這一點,而無需使用動態SQL或臨時表。

將param = 1傳遞給union,其他任何東西只返回第一個結果集:

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

如果它們都是完全相同的結構,那么為什么沒有一個帶有參數的表來區分這兩個表呢? 那時,對於您收到的結果集的參數的案例陳述,這變得很簡單。

第二種選擇是雙結果集。 您可以從存儲過程中選擇多個結果集。 然后在代碼中,您將使用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")

這很容易。

/* 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,則返回它,否則它將被丟棄。

這總是計算為true,因此返回每一行。

select * 
from tableX
where 1 = 1

這總是計算為false,因此不返回任何行(有時用作快速和臟的get-me-the-columns查詢)。

select * 
from tableX
where 1 = 0

這將返回任一表中的值,具體取決於您是否在參數上傳遞了值

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

您只需要為where子句添加其余條件

使用視圖。

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

SELECT * FROM view_both WHERE source <@source_flag

優化器根據源確定要使用哪個或哪兩個表,而不要求對其進行索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM