Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL表中获取表变量中每个项的值,如果项不';不存在_Sql_Sql Server_Sql Server 2008_Tsql_Join - Fatal编程技术网

从SQL表中获取表变量中每个项的值,如果项不';不存在

从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

我有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   |
代码

我想从结果表中返回结果代码表中每个结果代码的数据,如果特定代码不存在,则返回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