我有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。
答案 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
注意:我已编写代码以匹配所需的输出,因此排序与您的代码不同