SELECT
MessageMaster.MessageId,
MessageMaster.MessageType,
MessageMaster.MessageDescription,
MD1.DetailType,
MD1.DetailValue,
MD2.DetailType,
MD2.DetailValue
FROM
(
(
SELECT *
FROM MessageMaster
INNER JOIN MessageMasterDetail
ON MessageMaster.MessageId = MessageMasterDetail.MessageId
) AS TAB1
INNER JOIN MessageDetail AS MD1
ON TAB1.DetailId = MD1.DetailId
)
LEFT JOIN MessageDetail AS MD2
ON TAB1.AssociatedDetailId = MD2.DetailId;
它显示了错误。我不知道那是什么问题。我在这里附上了3张表
答案 0 :(得分:1)
您无法访问上一次加入中的TAB1
,因为它位于FROM
之外。因此,请为结果集提供别名TAB2
并使用它在上一次加入中,您必须将MD1
和MessageMaster
更改为TAB2
,因为这两个级别都不可用。
SELECT
TAB2.MessageId,
TAB2.MessageType,
TAB2.MessageDescription,
TAB2.DetailType,
TAB2.DetailValue,
MD2.DetailType,
MD2.DetailValue
FROM
(
(
SELECT *
FROM MessageMaster
INNER JOIN MessageMasterDetail
ON MessageMaster.MessageId = MessageMasterDetail.MessageId
) AS TAB1
INNER JOIN MessageDetail AS MD1
ON TAB1.DetailId = MD1.DetailId
) TAB2
LEFT JOIN MessageDetail AS MD2
ON TAB2.AssociatedDetailId = MD2.DetailId;
答案 1 :(得分:1)
您以非常奇怪的方式构建了查询。我不知道你是否需要任何子查询。但我强烈认为你不需要有一个双重嵌套的子查询。在下面的查询中,我试图清理一下。我看到的主要问题,以及可能是错误的直接原因,是您使用不可用的别名来选择内容。
SQL的一般规则是,您可以选择一个属于同一级别的表的列,一个以同一级别的表名开头的列,或者以同一个表的别名开头的列。水平。你没有这样做,但下面的查询是。
SELECT
TAB1.MessageId,
TAB1.MessageType,
TAB1.MessageDescription,
MD1.DetailType,
MD1.DetailValue,
MD2.DetailType,
MD2.DetailValue
FROM
(
SELECT *
FROM MessageMaster
INNER JOIN MessageMasterDetail
ON MessageMaster.MessageId = MessageMasterDetail.MessageId
) AS TAB1
INNER JOIN MessageDetail AS MD1
ON TAB1.DetailId = MD1.DetailId
LEFT JOIN MessageDetail AS MD2
ON TAB1.AssociatedDetailId = MD2.DetailId;