Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 Server加入_Sql_Sql Server_Ms Access - Fatal编程技术网

SQL Server加入

SQL Server加入,sql,sql-server,ms-access,Sql,Sql Server,Ms Access,我当前处理的查询返回所需的结果,但问题是我必须为我要添加的每个额外列创建一个具有不同TaskCounters的附加联接(当然这不是一个理性的决定) 查询应该在SQLServer和Access数据库上运行,因此我不需要Access中不支持的任何特殊功能(如Pivot、CTE等)。我需要修改该查询,以便尽可能减少联接的数量 tblConsultations是主表,其中根据就诊类型记录特定儿童的条目(即,如果我们有4次就诊,我们有4次就诊条目)。结果列应显示这4次访问的值,如果没有访问的值,则显示NU

我当前处理的查询返回所需的结果,但问题是我必须为我要添加的每个额外列创建一个具有不同TaskCounters的附加联接(当然这不是一个理性的决定)

查询应该在SQLServer和Access数据库上运行,因此我不需要Access中不支持的任何特殊功能(如Pivot、CTE等)。我需要修改该查询,以便尽可能减少联接的数量

tblConsultations是主表,其中根据就诊类型记录特定儿童的条目(即,如果我们有4次就诊,我们有4次就诊条目)。结果列应显示这4次访问的值,如果没有访问的值,则显示NULL

我想消除对同一个表的额外连接的需要,我必须为每一个附加列添加该表

查询如下:

SELECT Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC) AS pkChildID
,tc2.VisitType
,tblQuitOffered.Result AS KWA_QuitOffered
,tblQuitReferral.Result As KWA_QuitReferral
FROM tblConsultations tc2
INNER JOIN tblChild tc ON tc2.ChildCounter = tc.ChildCounter
LEFT  JOIN tblDelivery td ON td.ChildCounter = tc.ChildCounter
LEFT JOIN (
SELECT ttr.ResultCounter
    ,ttr.ChildCounter
    ,tkt.VisitType
    ,ttr.Result
    ,ttr.TaskCounter
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
    AND tkt.TaskCounter IN (
        '001410'
        ,'001463'
        ,'001431'
        )

) AS tblQuitOffered ON tc2.VisitType = tblQuitOffered.VisitType
AND tblQuitOffered.ChildCounter = tc2.ChildCounter
LEFT JOIN (
SELECT  ttr.ChildCounter
    ,tkt.VisitType
    ,ttr.Result
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
    AND tkt.TaskCounter IN (
        '001411'
        ,'001464'
        ,'001432'
        )
) AS tblQuitReferral ON tc2.VisitType = tblQuitReferral.VisitType
AND tblQuitReferral.ChildCounter = tc2.ChildCounter
WHERE tc2.VisitType in (1, 2, 3, 4)
AND tc2.ConsDate BETWEEN '20130127' and '20130228'
ORDER BY tc2.ChildCounter,tc2.VisitType
pkChildID   VisitType     KWA_QuitOffered   KWA_QuitReferral
2224        1             No                No
2224        3             NULL              NULL
2224        4             NULL              NULL
2225        1             No                Yes
2225        2             Yes               Yes
2225        3             Yes               Yes
2225        4             NULL              NULL
结果如下:

SELECT Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC) AS pkChildID
,tc2.VisitType
,tblQuitOffered.Result AS KWA_QuitOffered
,tblQuitReferral.Result As KWA_QuitReferral
FROM tblConsultations tc2
INNER JOIN tblChild tc ON tc2.ChildCounter = tc.ChildCounter
LEFT  JOIN tblDelivery td ON td.ChildCounter = tc.ChildCounter
LEFT JOIN (
SELECT ttr.ResultCounter
    ,ttr.ChildCounter
    ,tkt.VisitType
    ,ttr.Result
    ,ttr.TaskCounter
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
    AND tkt.TaskCounter IN (
        '001410'
        ,'001463'
        ,'001431'
        )

) AS tblQuitOffered ON tc2.VisitType = tblQuitOffered.VisitType
AND tblQuitOffered.ChildCounter = tc2.ChildCounter
LEFT JOIN (
SELECT  ttr.ChildCounter
    ,tkt.VisitType
    ,ttr.Result
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
    AND tkt.TaskCounter IN (
        '001411'
        ,'001464'
        ,'001432'
        )
) AS tblQuitReferral ON tc2.VisitType = tblQuitReferral.VisitType
AND tblQuitReferral.ChildCounter = tc2.ChildCounter
WHERE tc2.VisitType in (1, 2, 3, 4)
AND tc2.ConsDate BETWEEN '20130127' and '20130228'
ORDER BY tc2.ChildCounter,tc2.VisitType
pkChildID   VisitType     KWA_QuitOffered   KWA_QuitReferral
2224        1             No                No
2224        3             NULL              NULL
2224        4             NULL              NULL
2225        1             No                Yes
2225        2             Yes               Yes
2225        3             Yes               Yes
2225        4             NULL              NULL

如果我理解正确,您可以在单个派生表中包含所需的所有
TaskCounter
值,然后使用
CASE
语句分配列值:

SELECT Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) 
            AS NUMERIC) AS pkChildID
      ,tc2.VisitType

      ,MAX(CASE WHEN tktResults.TaskCounter IN (
                '001410'
               ,'001463'
               ,'001431'
               ) THEN tktResults.Result END
          ) AS KWA_QuitOffered

      ,MAX(CASE WHEN tktResults.TaskCounter IN (
                '001411'
               ,'001464'
               ,'001432'
               ) THEN tktResults.Result END
          ) AS KWA_QuitReferral

FROM  tblConsultations tc2
INNER JOIN tblChild tc 
  ON  tc2.ChildCounter = tc.ChildCounter
LEFT  JOIN tblDelivery td
  ON  td.ChildCounter = tc.ChildCounter

LEFT JOIN (
   SELECT ttr.ResultCounter
         ,ttr.ChildCounter
         ,tkt.VisitType
         ,ttr.Result
         ,ttr.TaskCounter
   FROM tblTaskResults ttr
   INNER JOIN tlkpKeyTasks tkt 
   ON tkt.TaskCounter = ttr.TaskCounter
       AND tkt.TaskCounter IN (
            '001410'
           ,'001463'
           ,'001431'
           ,'001411'
           ,'001464'
           ,'001432'
           )
   ) AS tktResults 
ON     tktResults.VisitType    = tc2.VisitType
   AND tktResults.ChildCounter = tc2.ChildCounter

WHERE tc2.VisitType in (1, 2, 3, 4)
  AND tc2.ConsDate BETWEEN '20130127' and '20130228'
GROUP BY 1, 2
ORDER BY tc2.ChildCounter,tc2.VisitType
事实上,您并不需要将其作为派生表(左连接(…)部分),但我假设您这样做是出于性能原因。当您根据
任务计数器的不同值添加列时,只需将它们添加到联接条件中即可

编辑:修改为使用带有
MAX
函数的
groupby
子句,通过
pkChildID
VisitType
返回唯一行

我在
groupby
子句中使用了“ordered list”样式;如果不支持,您可能需要如下指定:

GROUP BY Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC)
        ,tc2.VisitType
Code    QuitOffered    QuitReferral
001410  1              Null
001462  1              Null
001431  1              Null
001411  Null           1
001464  Null           1
001432  Null           1

我还注意到您正在按一列排序,该列不是SELECT子句的一部分。我不知道为什么,但还是原封不动。

我发布了一个答案,有人认为这与BellevueBob发布的答案类似

我认为可以使用嵌套的iif()而不是“case-when”


在SQL中,创建一个新表通常可以解决一个问题。我们称之为coderesolve

看起来是这样的:

GROUP BY Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC)
        ,tc2.VisitType
Code    QuitOffered    QuitReferral
001410  1              Null
001462  1              Null
001431  1              Null
001411  Null           1
001464  Null           1
001432  Null           1
您可以为要执行的每个“新”联接添加更多列

那么您的代码如下所示

SELECT 
  Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC) 
     AS pkChildID
  ,tc2.VisitType
  ,ttr.Result AS KWA_QuitOffered
  ,ttr.Result As KWA_QuitReferral
FROM tblConsultations tc2
INNER JOIN tblChild tc ON tc2.ChildCounter = tc.ChildCounter
LEFT  JOIN tblDelivery td ON td.ChildCounter = tc.ChildCounter
JOIN  tblTaskResults ttr on tc2.VisitType = ttr.VisitType
JOIN  tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
JOIN  coderesolve cr on cr.code = tkt.TaskCounter 
   AND COALESCE(cr.QuitOffered,cr.QuitReferral,0) = 1
WHERE tc2.VisitType in (1, 2, 3, 4)
AND tc2.ConsDate BETWEEN '20130127' and '20130228'
ORDER BY tc2.ChildCounter,tc2.VisitType
这应该适用于访问。但是访问很有趣,所以没有承诺


另一个注意事项是,我假设您的代码是互斥的(在coderesolve连接上只提供一行结果),如果不是这样,您可能必须将其分解为子查询,并根据您的模型进行分组或区分;但我认为可以使用VBA。我错过了关于拥有包含MS Access的便携式解决方案的部分。我自己在“真正”的工作中不太使用Access。困难的是sql server和ms Access之间的可移植性,不幸的是,它们在函数和联接方面没有相同的语法。MS Access需要在多个表联接周围加括号。您好BellevueBob,您的回答与我的要求非常接近,只是现在我看到每个pkChildID对应两条记录,而不是一条。为了进一步说明,早些时候我在结果集中有7条记录(儿童4种就诊类型(2225)和儿童3种就诊类型(2224)),但现在它向我显示了11条记录。区别就像我之前通过以下方式得到的结果集:pkChildID访问类型KWA_QuitOffered KWA_QuitReferral 2224 1否,但现在它变成了pkChildID访问类型KWA_QuitOffered KWA_QuitReferral 2224 1否NULL 2224 1 NULL No please Help web搜索还向我显示了
开关
功能,该功能也可以用于访问,但遗憾的是,我认为这两种功能在SQL Server中都不起作用。取决于SQL Server
IIF
的版本可能不受支持。它是在SQL Server 2012中提供的。哦,我明白了。你想要一些既能使用SQL又能使用Ms Access的东西……是的,你说得对,BellevueBob……到目前为止,我还没有尝试过SQL 2012,但我可以告诉你……如果你能通过某种方式动态检测到你正在使用的数据中心……也许你可以替换你的查询……嗯?我认为你找不到一个令人满意的答案,将与SQL Server和MS Access一起使用。正如bluefeet提到的,SQL语法本身是不同的。每个环境可能需要不同的解决方案。@BellevueBob我不同意,看起来AMS需要的只是GROUP BY子句。但对我来说,一个谜是如何使用TaskCounter来确定报价和报价。@BellevueBob-我相信我找到了答案:D