Sql 是否可以在Access 2003上使用交叉连接+内部和/或外部连接?如果是,怎么做?可能还需要子查询。。。?
我有一个包含多个表的数据库:[计划收入],[计划收入费用],[支持提供商],[Z服务代码新] 我已经编写了一个查询,该查询将计算在lat 6 mos期间,每个供应商在特定服务代码中列出了多少费用记录。唯一的问题是,理想情况下,我希望它也列出0的服务代码,其中没有费用记录在过去6个月 因此,基本上,我想将[Z Service Codes New]表与[Support Providers]表交叉,以获得提供者和所有服务代码之间的所有可能匹配。然后,在每个服务代码中,我希望它计算过去6个月内的费用记录数。实际上,我已经将其设置为自定义日期,因此它更灵活 但我一直在思考如何做到这一点,这样它就不会将所有费用记录与所有服务代码进行匹配,而是只匹配那些在正确服务代码范围内的费用记录(如果有的话) [Plan Revenue]。[Service]是与[Z Service Codes New]。[Service Code]匹配的外键 [Plan Revenue]。[Rev ID]是与[Plan Revenue Expense]匹配的外键。[Rev ID] [Plan Revenue Expense]。[SP]是与[Support Provider]。[ID]匹配的外键 为了简单起见,不要问我为什么数据库构建器没有使表上的键与表上的键匹配。就是这样 我当前的查询如下所示: 问题解决了 P>我认为必须把问题解决,有助于解决这个问题,因为我自己考虑了实际问题是什么,哪些特定的信息需要是一个交叉产品,哪些信息需要更标准的连接操作,以及如何正确地连接这两个集合……/P>Sql 是否可以在Access 2003上使用交叉连接+内部和/或外部连接?如果是,怎么做?可能还需要子查询。。。?,sql,subquery,ms-access-2003,cross-join,Sql,Subquery,Ms Access 2003,Cross Join,我有一个包含多个表的数据库:[计划收入],[计划收入费用],[支持提供商],[Z服务代码新] 我已经编写了一个查询,该查询将计算在lat 6 mos期间,每个供应商在特定服务代码中列出了多少费用记录。唯一的问题是,理想情况下,我希望它也列出0的服务代码,其中没有费用记录在过去6个月 因此,基本上,我想将[Z Service Codes New]表与[Support Providers]表交叉,以获得提供者和所有服务代码之间的所有可能匹配。然后,在每个服务代码中,我希望它计算过去6个月内的费用记录
~MG me好吧,我自己的解决方案看起来很优雅——好吧,我不知道它是否优雅,但它似乎有效!是在my main FROM子句中生成两个自定义SELECT语句,然后根据两个匹配条件连接两个SELECT语句: 问题解决了 P>我认为必须把问题解决,有助于解决这个问题,因为我自己考虑了实际问题是什么,哪些特定的信息需要是一个交叉产品,哪些信息需要更标准的连接操作,以及如何正确地连接这两个集合……/P>
~MG OP@Isaac:像这样的。。。我在写问题的时候并没有马上弄明白,但最终我的脑子里有了某种东西。我猜正确的一对突触彼此接触并形成髓鞘。瞧,答案诞生了。希望有一天这个解决方案能帮助其他有类似问题的人。。。所以,是的,在FROM部分的一个子查询中交叉连接,在FROM部分的另一个子查询中对其他表进行常规连接,然后根据需要连接两个子查询。急板地。一切都很闪亮!我本来打算这么做的,但它告诉我,我是一个太新的q用户,直到6个小时过去了,我才能回答自己的问题。所以,我只是在等…真的吗?我必须等11个小时才能接受我自己的答案,而我必须等6个小时才能发布?唉,我想这是为了防止有人发布更好的答案;
SELECT [support provider].[sp last],
[support provider].[sp first],
[support provider].[sp mi],
[support provider].[agency],
[support provider].[de?],
[support provider].[ic?],
[support provider].[agency?] AS [AG?],
[support provider].[generalbus?] AS [GB?],
[ExpsToCount].[counted svc],
Iif(Count([ExpsToCount].[exptocountid]) = 0, 0, Count(
[ExpsToCount].[exptocountid])) AS ExpCount
FROM [support provider]
LEFT JOIN (SELECT [plan revenue expense].[sp] AS [Counted SP],
[z service codes new].[service code] AS [Counted Svc],
[plan revenue expense].[exp id] AS [ExpToCountID]
FROM [z service codes new]
LEFT JOIN ([plan revenue]
LEFT JOIN [plan revenue expense]
ON [plan revenue].[rev id] =
[plan revenue expense].[revid])
ON [z service codes new].[service code] =
[plan revenue].[service]
WHERE ( [plan revenue expense].[checkdt] >=
Format([period beginning "mm/dd/yyyy"], "short date")
AND [plan revenue expense].[checkdt] <=
Format([periond ending "mm/dd/yyyy"], "short date") ))
AS ExpsToCount
ON [ExpsToCount].[counted sp] = [support provider].[id]
WHERE [support provider].[inactive?] = false
AND ( [support provider].[de?] = true
OR [support provider].[ic?] = true )
GROUP BY [support provider].[sp last],
[support provider].[sp first],
[support provider].[sp mi],
[support provider].[agency],
[support provider].[de?],
[support provider].[ic?],
[support provider].[agency?],
[support provider].[generalbus?],
[ExpsToCount].[counted svc]
ORDER BY [ExpsToCount].[counted svc],
[support provider].[agency],
[support provider].[sp last],
[support provider].[sp first],
[support provider].[sp mi],
[ExpsToCount].[counted svc];
SELECT [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SvcCode], IIf(COUNT([ExpsToCount].[ExpCountID])=0,0,COUNT([ExpsToCount].[ExpCountID])) AS [Exp Count]
FROM (SELECT [Support Provider].[ID] AS [CodeProvider], [Support Provider].[SP Last], [Support Provider].[SP First], [Support Provider].[SP MI], [Support Provider].[Agency], [Z Service Codes New].[Service Code] AS [SvcCode]
FROM [Support Provider], [Z Service Codes New]
WHERE [Support Provider].[Inactive?]=FALSE
AND ([Support Provider].[DE?]=TRUE OR [Support Provider].[IC?]=TRUE)
AND NOT ([Z Service Codes New].[Service Code] LIKE '111*'
OR [Z Service Codes New].[Service Code] LIKE '222*'
OR [Z Service Codes New].[Service Code] LIKE '333*')
GROUP BY [Support Provider].[ID], [Support Provider].[SP Last], [Support Provider].[SP First], [Support Provider].[SP MI], [Support Provider].[Agency], [Z Service Codes New].[Service Code]) AS [ProvidersXCodes]
LEFT JOIN (SELECT [Support Provider].[ID] AS [ExpCountProv], [Plan Revenue].[Service] AS [ExpCountSvc], [Plan Revenue Expense].[Exp ID] AS [ExpCountID]
FROM [Plan Revenue], [Plan Revenue Expense], [Support Provider]
WHERE [Plan Revenue].[Rev ID]=[Plan Revenue Expense].[RevID]
AND [Plan Revenue Expense].[SP]=[Support Provider].[ID]
AND [Support Provider].[Inactive?]=FALSE
AND ([Support Provider].[DE?]=TRUE OR [Support Provider].[IC?]=TRUE)
AND ([Plan Revenue Expense].[CheckDt]>=Format([Period Beginning "MM/DD/YYYY"],"Short Date") AND [Plan Revenue Expense].[CheckDt]<=Format([Periond Ending "MM/DD/YYYY"],"Short Date"))
GROUP BY [Support Provider].[ID], [Plan Revenue].[Service], [Plan Revenue Expense].[Exp ID]) AS [ExpsToCount] ON ([ProvidersXCodes].[CodeProvider]=[ExpsToCount].[ExpCountProv] AND [ProvidersXCodes].[SvcCode]=[ExpsToCount].[ExpCountSvc])
GROUP BY [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SvcCode]
ORDER BY [ProvidersXCodes].[SvcCode], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI];
SELECT [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SvcCode], IIf(COUNT([ExpsToCount].[ExpCountID])=0,0,COUNT([ExpsToCount].[ExpCountID])) AS [Exp Count]
FROM (SELECT [Support Provider].[ID] AS [CodeProvider], [Support Provider].[SP Last], [Support Provider].[SP First], [Support Provider].[SP MI], [Support Provider].[Agency], [Z Service Codes New].[Service Code] AS [SvcCode]
FROM [Support Provider], [Z Service Codes New]
WHERE [Support Provider].[Inactive?]=FALSE
AND ([Support Provider].[DE?]=TRUE OR [Support Provider].[IC?]=TRUE)
AND NOT ([Z Service Codes New].[Service Code] LIKE '111*'
OR [Z Service Codes New].[Service Code] LIKE '222*'
OR [Z Service Codes New].[Service Code] LIKE '333*')
GROUP BY [Support Provider].[ID], [Support Provider].[SP Last], [Support Provider].[SP First], [Support Provider].[SP MI], [Support Provider].[Agency], [Z Service Codes New].[Service Code]) AS [ProvidersXCodes]
LEFT JOIN (SELECT [Support Provider].[ID] AS [ExpCountProv], [Plan Revenue].[Service] AS [ExpCountSvc], [Plan Revenue Expense].[Exp ID] AS [ExpCountID]
FROM [Plan Revenue], [Plan Revenue Expense], [Support Provider]
WHERE [Plan Revenue].[Rev ID]=[Plan Revenue Expense].[RevID]
AND [Plan Revenue Expense].[SP]=[Support Provider].[ID]
AND [Support Provider].[Inactive?]=FALSE
AND ([Support Provider].[DE?]=TRUE OR [Support Provider].[IC?]=TRUE)
AND ([Plan Revenue Expense].[CheckDt]>=Format([Period Beginning "MM/DD/YYYY"],"Short Date") AND [Plan Revenue Expense].[CheckDt]<=Format([Periond Ending "MM/DD/YYYY"],"Short Date"))
GROUP BY [Support Provider].[ID], [Plan Revenue].[Service], [Plan Revenue Expense].[Exp ID]) AS [ExpsToCount] ON ([ProvidersXCodes].[CodeProvider]=[ExpsToCount].[ExpCountProv] AND [ProvidersXCodes].[SvcCode]=[ExpsToCount].[ExpCountSvc])
GROUP BY [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SvcCode]
ORDER BY [ProvidersXCodes].[SvcCode], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI];