2012-07-21 82 views
1

假設我有一個有很多行和列(別名:bigtable)的表和一個總是有1行,但有多列(別名:1rowtable)的表。 lrowtable與bigtable無關,只是在那裏爲我的腳本使用的一些設置動態修改。所以我不能使用靜態SQLCMD變量,因爲我的腳本有GO語句,所以我不能使用正常變量。同時從兩個不相關的表中選擇

現在我想編寫一個訪問兩個表的select語句。

如果我做的:

SELECT ... FROM bigtable, 1rowtable 

它一個CROSS JOIN,這樣是不好的,不能走這條路。

如果我用1rowtable的CTE,我有

SELECT field FROM 1rowtable 

訪問其字段所以這是太糟糕。同樣的,像一個表值函數:

CREATE FUNCTION getSetting(@name nvarchar(40)) 
RETURNS TABLE 
AS 
RETURN (SELECT name FROM 1rowtable WHERE name = @name) 

很明顯,我不能用一個標量函數,因爲在所有它只返回一個特定的數據類型,但設置有不同的數據類型。然而,顯然我想用它當然不用做'SELECT .. FROM dbo.getfieldfrom1rowtable(..)'東西,因爲我在查詢中經常使用1rowtable。

我也試圖做:

SELECT 
    (SELECT 
    <expression involving bigtable and 1rowtable>, 
    <expression involving bigtable and 1rowtable>, 
    <expression involving bigtable and 1rowtable>, 
    ... 
    FROM 1rowtable) 
FROM bigtable 

但當然,子查詢不能超過一個項目,如果它不存在與開始...

所以,我應該怎麼辦選擇?看來我必須每次都繼續使用'SELECT .. FROM dbo.getfieldfrom1rowtable(..)'?只是好奇:)

PS。 ms sql server 2008r2

回答

2

使用交叉連接將表中的行結合在一起沒有任何問題,特別是當只有一行時。

使用語法:

select bt.*, ort.* 
from bigtable bt cross join 
    onerowtable ort 

沒有什麼本質上的「錯誤」與交叉連接一起,當它們被正確使用。問題在於他們被無意中使用。如果你交叉連接兩百萬行的表。 。 。好吧,你的臨時空間將會填滿,你的處理器將非常繁忙,並且由於缺乏資源,查詢最終會崩潰。

但是,將一個表與一行交叉連接到另一個表完全沒有問題。