我有一張桌子,裏面儲存了我曾經工作過的各種客戶,由政府和商業專欄分隔。問題在於任何一列中的客戶端數量可能都不一致。當我做一個SELECT時,我在不規則的地方結束NULL值,因爲我想不出一個乾淨的方式來排序結果集。例如,以下是可能的直SELECT(沒有ORDER BY):表格變量:是否有更清潔的方法?
Government | Commercial DOD | IBM DOS | Microsoft | Novell DVA | Oracle
正如你所看到的,有在政府列NULL值,因爲有更多的商業客戶比政府。這可能會隨時發生變化,並且不能保證哪個列將具有更多值。爲了在結果集中消除空白值的渲染,我決定在表變量中執行兩個單獨的SELECT(一個用於政府客戶端,另一個用於Commercial),然後選擇一個最終時間,將它們連接在一起:
DECLARE @Government TABLE
(
Row int,
PortfolioHistoryId uniqueidentifier,
Government varchar(40),
GovernmentPortfolioContentId uniqueidentifier
)
DECLARE @Commercial TABLE
(
Row int,
PortfolioHistoryId uniqueidentifier,
Commercial varchar(40),
CommercialPortfolioContentId uniqueidentifier
)
INSERT INTO @Government
SELECT
(ROW_NUMBER() OVER (ORDER BY Government)) AS Row,
PortfolioHistoryId,
Government,
GovernmentPortfolioContentId
FROM dbo.PortfolioHistory
WHERE Government IS NOT NULL
INSERT INTO @Commercial
SELECT
(ROW_NUMBER() OVER (ORDER BY Commercial)) AS Row,
PortfolioHistoryId,
Commercial,
CommercialPortfolioContentId
FROM dbo.PortfolioHistory
WHERE Commercial IS NOT NULL
SELECT
g.Government,
c.Commercial,
g.GovernmentPortfolioContentId,
c.CommercialPortfolioContentId
FROM @Government AS g
FULL OUTER JOIN @Commercial AS c ON c.Row = g.Row
我不一定不滿意這個查詢(也許我應該),但有沒有更清晰的方法來實現這個?
謝謝你的迴應。我不是爭論性的(我真的不明白),但是那會給我買什麼?我認爲這是足夠的,只需按順序顯示它們(因此加入行號)。順便說一句,我認爲你的意思是全外聯接。;-) – senfo 2009-11-10 13:15:48