gpt4 book ai didi

SQL 服务器连接

转载 作者:行者123 更新时间:2023-12-02 02:03:41 24 4
gpt4 key购买 nike

我当前正在处理的查询返回了所需的结果,但问题是我必须为我想要添加的每个额外列创建一个包含不同 TaskCounters 的额外连接(这当然不是一个合理的决定)。

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

tblConsultations 是主表,其中根据 Access 类型记录了特定 child 的条目(即,如果我们有 4 次 Access ,我们有 4 个咨询条目)。结果列应显示这 4 次 Access 的值,如果没有针对 Access 的值,则显示 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

事实上,您并不真的需要将其设为派生表(LEFT JOIN (...) 部分),但我假设您这样做是出于性能原因。当您根据 TaskCounter 的不同值添加列时,只需将它们添加到连接条件即可。

编辑:修改为使用 GROUP BY 子句和 MAX 函数以通过 pkChildID Access 类型

我在 GROUP BY 子句中使用了“有序列表”样式;如果不支持,您可能需要像这样指定它:

GROUP BY Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC)
,tc2.VisitType

我还注意到您正在按不属于 SELECT 子句的列进行排序。我不确定为什么,但保留了原样。

关于SQL 服务器连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15998132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com