2011-07-04 58 views
0

我需要小查詢的幫助。查詢查詢

表A: - 狀態及其內容如下。

status_id  status_descrip 
     1   held 
     2   release 
     3   WIP 

表B: - Entry是另一個有大約30個字段的表。其中2個字段指的是表A->狀態表。爲了簡單起見,我跳過其他字段並僅記下與狀態相關的字段。

entry_id  design_status   stress_status 
    1     3     1 
    2     1     2 
    3     NULL    2 
    4     3     3 
    5     NULL    1 
    6     NULL    NULL  
    7     NULL    2 

我不能改變條目的結構分裂成2代表一個作爲design_status等作爲stress_status。

現在我想從條目表中的條目用他們的描述替換狀態。所以輸出將是

entry_id  design_status_descrip   stress_status_descrip 
     1     WIP       held 
     2     held       release 
     3     NULL       release 
     4     WIP       WIP. 
     5     NULL       held 
     6     NULL       NULL 
     7     NULL       release 

在此先感謝!

編輯: -

問題用條目編輯。

謝謝你的所有迴應!

終於爲我工作的查詢,

SELECT  b.entry_id,  design_status_descrip = d.status_descrip, 
    stress_status_descrip = s.status_descrip FROM  entry AS b 
    LEFT OUTER JOIN status AS d  ON b.design_status = d.status_id 
    LEFT OUTER JOIN status AS s  ON b.stress_status = s.status_id 

不要讓我知道,如果我能改善這個查詢。

+0

請問您可以指定您正在使用的SQL Server版本。 –

回答

1

最簡單的方法是加入對狀態表的兩倍。我已經使用了INNER JOIN,假定您的模式中的design_status和stress_status列具有適當的約束。針對變更的要求進行編輯。

DECLARE @status TABLE 
(
    status_id INT PRIMARY KEY, 
    status_descrip VARCHAR(32) NOT NULL UNIQUE 
); 

INSERT @status SELECT 1,'held' UNION SELECT 2,'release' UNION SELECT 3,'WIP'; 

DECLARE @b TABLE 
(
    entry_id INT PRIMARY KEY, 
    design_status INT, 
    stress_status INT 
); 

INSERT @b SELECT 1,3,1 
UNION SELECT 2,1,2 
UNION SELECT 3,NULL,2 
UNION SELECT 4,3,3 
UNION SELECT 5,NULL,1 
UNION SELECT 6,NULL,NULL 
UNION SELECT 7,NULL,2; 

SELECT 
    b.entry_id, 
    design_status_descrip = d.status_descrip, 
    stress_status_descrip = s.status_descrip 
FROM 
    @b AS b 
    LEFT OUTER JOIN @status AS d 
    ON b.design_status = d.status_id 
    LEFT OUTER JOIN @status AS s 
    ON b.stress_status = s.status_id; 
+0

是的,請下次發佈完整的問題。 :-) –

+0

對不起,下次我會小心。:) – satya

1
SELECT 
    e.entry_id, 
    s1.status_descrip as design_status_descrip, 
    s2.status_descrip as stress_status_descrip 
FROM entry e, status s1, status s2 
WHERE 
    e.design_status = s1.status_id 
    AND e.stress_status = s2.status_id 
+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼樣本」按鈕(「{}」)以精確地格式化和語法突出顯示它! –

+2

另外:我會建議反對JOIN的舊式「桌子,桌子,桌子」樣式 - 太容易了,你忘記了WHERE子句中的一個連接條件,並且最終產生了笛卡爾積。相反,使用新的ANSI風格'INNER JOIN狀態s1 ON e.design_status = s1.status_id' - 這是標準,這是更清潔,更不容易出錯.... –

1

剛剛加入兩次,狀態表

From 
     Entry e 
    Inner join status ds 
    On e. design_status_id = ds.status_id 
    Inner join status ss 
    On e.stress_status_id = ss.status_id 
1

幾種方法,首先是最有效的。

 
SELECT 
    e.entry_id 
    , MAX(CASE WHEN e.design_status = s.status_id THEN s.status_descrip END) AS design_status_descrip 
    , MAX(CASE WHEN e.stress_status = s.status_id THEN s.status_descrip END) AS stress_status_descrip 
FROM 
    dbo.[Entry] e 
LEFT OUTER JOIN 
    dbo.[Status] s 
ON s.status_id = e.design_status 
OR s.status_id = e.stress_status 
GROUP BY 
    entry_id

SELECT e.entry_id , ds.status_descrip AS design_status_descrip , ss.status_descrip AS stress_status_descrip FROM dbo.[Entry] e LEFT OUTER JOIN dbo.[status] ds ON ds.status_id = e.design_status LEFT OUTER JOIN dbo.[status] ss ON ss.status_id = e.stress_status

+0

我唯一關心的第一個問題是,由於分組而添加Entry中的其他列變得非常棘手。 –

+0

確實如此,但在另一方面,我已經看到了重複連接方法重複,重複和重複的情況...我可以記得我剛剛查看的一個查詢中的15個連接到同一個表。根本原因是糟糕的設計,但隨着OP提到(無法更改表結構),這不是我們總能解決的問題。 –

+0

這個很小的查找表(即使有100多個條目)幾乎肯定會記憶在內存中,所以即使您參與了估計計劃和實際計劃,您也可能會看到更大的性能差異它15次。在這種情況下的關鍵將是更多的指標,而不是如何聯合發生恕我直言。 –

1

我注意到你在你的數據NULL的,在這種情況下,忽略使用INNER JOIN因爲這將有效地過濾掉任何行,在其中任何一列空了所有的答案。而是使用左連接。

SELECT 
    e.entry_id, 
    ds.status_description, 
    ss.ststua_description 
FROM entry e 
LEFT JOIN status ds 
    ON e.design_status = ds.status_id 
LEFT JOIN status ss 
    ON e.stress_status = ss.status_id 
+0

Jamiec,在一羣人已經花時間提交答案之後,OP添加了空值 - 原始問題表示沒有NULL。 –