从SQL表中获取表变量中每个项的值,如果项不存在则返回null

时间:2014-10-09 19:58:15

标签: sql sql-server sql-server-2008 tsql join

我有3个表,一个结果表,一个订单表和一个包含结果代码的表变量。

表格格式如下:

结果

| Patient_Order_ID | Result_Code | Result_Value | HospId |
|------------------|-------------|--------------|--------|
| 1                | WCC         | 10           | 123    |
| 1                | RCC         | 8            | 123    |
| 1                | HGB         | 13           | 123    |
| 2                | WCC         | 11           | 123    |
| 2                | RCC         | 9            | 123    |
| 3                | HGB         | 10           | 123    |
| 3                | RCC         | 10           | 123    |

订单

| Patient_Order_ID | Date_Collect |
|------------------|--------------|
| 1                | 2014-01-01   |
| 2                | 2014-01-05   |
| 3                | 2014-01-10   |

代码

| Result_Code |
|-------------|
| WCC         |
| RCC         |
| HGB         |

我想从结果表中返回结果代码表中每个结果代码的数据,如果特定代码不存在则返回null。像这样:

| Result Code | Result_Value | Date_Collect |
|-------------|--------------|--------------|
| WCC         | 10           | 2014-01-01   |
| RCC         | 8            | 2014-01-01   |
| HGB         | 13           | 2014-01-01   |
| WCC         | 10           | 2014-01-05   |
| RCC         | 8            | 2014-01-05   |
| HGB         | NULL         | 2014-01-05   |
| WCC         | NULL         | 2014-01-10   |
| RCC         | 10           | 2014-01-10   |
| HGB         | 13           | 2014-01-10   |

如果可能的话,我希望它们按照它们在代码表中出现的顺序排序。

到目前为止,我已经编写了以下T-SQL:

SELECT
    codes.Result_Code
  , results.Result_Value
  , orders.Date_Collect
FROM
    @resultCodes codes
    LEFT OUTER JOIN Results results ON codes.Result_Code = results.Result_code
    INNER JOIN Orders orders ON results.Patient_Order_ID = orders.Patient_Order_ID
WHERE
    results.Hospid = @prmHospid
ORDER BY   
    orders.Date_Collect DESC

这几乎以我想要的格式返回结果,但不包含所需的空值,也不对结果代码进行二次排序。任何帮助都会非常感激。

我正在使用SQL Server 2008。

1 个答案:

答案 0 :(得分:0)

在代码和订单之间尝试FULL OUTER JOIN

SQL小提琴http://sqlfiddle.com/#!3/99321/13

SELECT
    codes.Result_Code
  , results.Result_Value
  , orders.Date_Collect
FROM
     @resultCodes codes
    FULL OUTER JOIN Orders orders ON 1=1
    LEFT OUTER JOIN Results results ON codes.Result_Code = results.Result_code AND results.Hospid = 123 AND  orders.Patient_Order_ID=results.Patient_Order_ID  
ORDER BY   
    orders.Date_Collect, codes.Result_Code DESC

注意:我已编写代码以匹配所需的输出,因此排序与您的代码不同