从SQL表中获取表变量中每个项的值,如果项不';不存在
我有3个表,一个结果表,一个订单表和一个带有结果代码的表变量 表格格式如下所示: 结果从SQL表中获取表变量中每个项的值,如果项不';不存在,sql,sql-server,sql-server-2008,tsql,join,Sql,Sql Server,Sql Server 2008,Tsql,Join,我有3个表,一个结果表,一个订单表和一个带有结果代码的表变量 表格格式如下所示: 结果 | Patient_Order_ID | Result_Code | Result_Value | HospId | |------------------|-------------|--------------|--------| | 1 | WCC | 10 | 123 | | 1 | RCC
| 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 |
代码
我想从结果表中返回结果代码表中每个结果代码的数据,如果特定代码不存在,则返回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。请尝试在代码和订单之间切换
SQL小提琴:
注意:我已经编写了与所需输出相匹配的代码,因此排序与您的代码不同将where条件移动到左连接条件。Laurence说了什么。where谓词将左连接转换为内部连接。如果您查看执行计划,您应该会看到它变成了一个内部连接。每当您在WHERE子句(非NULL)中从左连接的右侧指定一个值时,引用另一个答案,您就必须消除所有的NULL值,它本质上成为一个内部连接。不是100%确定您的意思-我得到错误“关键字'OUTER'附近的语法不正确”,您不应该需要WHERE子句。将where子句中的谓词作为第二个连接谓词移动。至于排序,它不是排序,因为您没有在order by中定义“secondary”排序;如果不使用ORDER BY,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
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