2011-08-23 158 views
0

能否請您解釋這種情況背後的邏輯情況下,T-SQL在SQL Server 2005/2008

我有2個表

student表

CHECK-UP(PK)  STUDENTID   DATE 
1001     1    06/15/1980 
1002     1    07/30/1980 
1003     1    12/28/1980 
1004     2    03/22/1981 
1005     2    01/28/1981 
1006     3    04/20/1981 

活動表

CHECK-UP   INDEX    VALUE 
    1001     1    SMOKING 
    1001     2    ALCOHOL 
    1001     3    DRUGS 
    1002     1    SMOKING 
    1002     2    ALCOHOL 
    1003     1    SMOKING 
    1003     3    DRUGS 
    1004     3    DRUGS 

我在兩個表格之間使用簡單的內部連接來獲取與值'%SMOKING%'匹配的所有記錄。它給我3行有吸菸值,結果集爲1001,1002,1003,相應的studentsid爲1.

我需要做些什麼才能找到所有學生的吸菸信息?

在這種情況下,我必須首先在表格之間進行左連接以獲取所有記錄,但這不適用於我的情況以包含所有學生。請指教。下面是一段代碼。

Select DISTINCT STUDENTID 
       ,CHECK-UP 
       ,INDEX 
       ,CAST(VALUE as VARCHAR(MAX)) --CASTING IT SINCE IT IS A TEXT FIELD 
       ,CASE 
         WHEN (PATINDEX('%SMOKING%',act.VALUE)) THEN 
          'LMDO' 
         WHEN (PATINDEX('%NOT SMOKING%',act.VALUE)) THEN 
          'LMD1' 
         WHEN (ISNULL(CAST(act.VALUE as varchar(max)),'')='') THEN 
           'CLEAR' 
         ELSE 
           'CLEAR' 
        END done 
FROM STUDENT stu 
LEFT JOIN ACTIVITY act 
ON stu.CHECK-UP=act.CHECK-UP 
WHERE ?? 

如果假設爲studentID=3該學生沒有排隊吸菸。我希望這個價值進入'清除'時段。此外,我無法在條款中添加條件,因爲它會限制我的數據。可以做些什麼來解決這個問題?

我期待一個結果集是這樣的:

STUDENTID  CHECK-UP   INDEX   VALUE  DONE  DATE 
    1    1001    1   SMOKING  LMDO  06/15/1980 
    1    1002    1   SMOKING  LMDO  07/30/1980 
    1    1003    1   SMOKING  LMDO  12/28/1980 
    2    1004   NULL   NULL   CLEAR 03/22/1981 
    2    1005   NULL   NULL   CLEAR 01/28/1981 
    3    1006   NULL   NULL   CLEAR 04/20/1981 
+0

請爲您的示例數據添加期望的結果。 –

+0

開始放下截然不同的東西。你正在濫用它,因爲你想要的是一個聚合(group by),它隱藏了你的問題。你需要更準確地預測你期望的結果。學生1可以有多個檢查每個檢查多個活動。因此,學生可以在同一套「吸菸」,「不吸菸」和「清除」。你將不得不定義如何彙總。一旦你這樣做,你最終會在你當前的查詢中得到一個分組,或者通過子選擇結果 – Eddy

+0

Smith我添加了所需的結果集。 – palum

回答

1

根據你的榜樣結果和原始查詢我想你需要的東西沿着這些路線。

SELECT S.STUDENTID , 
     A.[CHECK-UP] , 
     A.[INDEX] , 
     A.[VALUE] , 
     CASE [VALUE] 
      WHEN 'SMOKING' THEN 'LMDO' 
      WHEN 'NOT SMOKING' THEN 'LMD1' 
      ELSE 'CLEAR' 
     END done , 
     S.[DATE] 
FROM STUDENT S 
     LEFT JOIN ACTIVITY A ON S.[CHECK-UP] = A.[CHECK-UP] 
           AND A.[INDEX] = 1 
+0

I試着通過把A. [INDEX] = 1我相信我們正在限制數據,NULL值不會被捕獲在結果集中。 – palum

+0

@palum - 您的查詢在「where」而不是「outer join」中有過濾器。對於您的示例數據,它將返回您所需的結果[在此演示](http://data.stackexchange.com/stackoverflow/q/110268/) –