![](/img/trans.png)
[英]T-SQL Union, but exclude results from one table based on another without using a temp table?
[英]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.