Sql 将多个相关记录选择到结果行中
我目前正在为MS Access数据库编写一个导出函数,我不太确定如何编写一个查询来提供我想要的结果。Sql 将多个相关记录选择到结果行中,sql,ms-access,select,Sql,Ms Access,Select,我目前正在为MS Access数据库编写一个导出函数,我不太确定如何编写一个查询来提供我想要的结果。 我想做的是: 假设我有一个表Error,它与表Cause有多对多的关系,由表ErrorCause建模。目前,我有一个类似于此的查询(简化了,原来的查询也更进一步): 我得到这样的东西: Error | Cause ------------- 12345 | 12 12345 | 23 67890 | 23 67890 | 34 Error | Cause1 |
我想做的是: 假设我有一个表
Error
,它与表Cause
有多对多的关系,由表ErrorCause
建模。目前,我有一个类似于此的查询(简化了,原来的查询也更进一步):
我得到这样的东西:
Error | Cause
-------------
12345 | 12
12345 | 23
67890 | 23
67890 | 34
Error | Cause1 | Cause2 | Cause3
--------------------------------
12345 | 12 | 23 |
67890 | 23 | 34 |
错误原因
-------------
12345 | 12
12345 | 23
67890 | 23
67890 | 34
但是我需要为每个错误选择第一个(比如3个原因)的ID(即使这些原因为空),因此它看起来如下所示:
Error | Cause
-------------
12345 | 12
12345 | 23
67890 | 23
67890 | 34
Error | Cause1 | Cause2 | Cause3
--------------------------------
12345 | 12 | 23 |
67890 | 23 | 34 |
错误|原因1 |原因2 |原因3
--------------------------------
12345 | 12 | 23 |
67890 | 23 | 34 |
有没有办法在一个查询中实现这一点?
比如选择前3个,然后将其展平到结果行中?
提前感谢您的指点 您的需求是针对特定数量的原因——3。这使得在同一行上通过对同一子查询执行三向联接来获得三个不同的原因成为可能,并且是可以管理的 首先,让我们将您的错误和原因查询定义为一个直接访问查询(如果您希望是技术性的,则为QueryDef对象)
qryErrorCauseInfo
:
顺便说一句,我觉得上面的左连接应该是一个内部连接,因为我在中提到的原因
接下来,让我们进行三向联接,以获取行中可能的原因组合:
qryTotalCause
:
简单!(不是:-)您的要求是针对特定数量的原因——3。这使得在同一行上通过对同一子查询执行三向联接来获得三个不同的原因成为可能,并且是可以管理的 首先,让我们将您的错误和原因查询定义为一个直接访问查询(如果您希望是技术性的,则为QueryDef对象)
qryErrorCauseInfo
:
顺便说一句,我觉得上面的左连接应该是一个内部连接,因为我在中提到的原因
接下来,让我们进行三向联接,以获取行中可能的原因组合:
qryTotalCause
:
简单!(非:-)交叉表查询?请看一下SQL Server Pivot命令。@Asantabala这不是SQL Server啊,对不起。看到MS和SQL,我的脑子里掉了球。请忽略。之后您将如何处理查询?交叉表查询?请看一下SQL Server Pivot命令。@Asantabala这不是SQL Server啊,对不起。看到MS和SQL,我的脑子里掉了球。请忽略。之后你对查询做了什么?哇,这比我想象的要复杂一点。我将在星期一试用,并让您知道它的工作原理。:)是的,三次使用同一个表的三向联接会创建大量多余的结果行,我们需要去掉这些结果行。这就是大部分复杂性的来源。但是在刚刚测试了整个过程之后,我相信经过一些调整后它会起作用。这真的很有效:)我仍然需要找出如何获得每个原因的5个解决方案,但这对我来说是一个很好的起点。谢谢哇,这比我想象的要复杂一点。我将在星期一试用,并让您知道它的工作原理。:)是的,三次使用同一个表的三向联接会创建大量多余的结果行,我们需要去掉这些结果行。这就是大部分复杂性的来源。但是在刚刚测试了整个过程之后,我相信经过一些调整后它会起作用。这真的很有效:)我仍然需要找出如何获得每个原因的5个解决方案,但这对我来说是一个很好的起点。谢谢
select distinct
*
, iif(Cause1 is null, 0, 1)
+ iif(Cause2 is null, 0, 1)
+ iif(Cause3 is null, 0, 1) as TotalCause
from (
select
eci1.ErrorID
, eci1.CauseID as Cause1
, iif(eci2.CauseID = Cause1, null, eci2.CauseID) as Cause2
, iif(
eci3.CauseID = Cause1 or eci3.CauseID = Cause2
, null
, eci3.CauseID
) as Cause3
from (qryErrorCauseInfo as eci1
left outer join qryErrorCauseInfo as eci2
on eci1.ErrorID = eci2.ErrorID)
left outer join qryErrorCauseInfo as eci3
on eci2.ErrorID = eci3.ErrorID
) as sq
where (
Cause1 < Cause2
and Cause2 < Cause3
) or (
Cause1 < Cause2
and Cause3 is null
) or (
Cause2 is null
and Cause3 is null
) or (
Cause1 is null
and Cause2 is null
and Cause3 is null
)
select
ErrorID
, Cause1
, Cause2
, Cause3
from qryTotalCause as tc1
where tc1.TotalCause = (
select max(tc2.TotalCause)
from qryTotalCause as tc2
where tc1.ErrorID = tc2.ErrorID
)