Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 是否可以在Access 2003上使用交叉连接+内部和/或外部连接?如果是,怎么做?可能还需要子查询。。。?_Sql_Subquery_Ms Access 2003_Cross Join - Fatal编程技术网

Sql 是否可以在Access 2003上使用交叉连接+内部和/或外部连接?如果是,怎么做?可能还需要子查询。。。?

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个月内的费用记录

我有一个包含多个表的数据库:[计划收入],[计划收入费用],[支持提供商],[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>
~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];