SQLite查询有什么问题

时间:2017-07-24 05:50:57

标签: sql database sqlite

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张表Image here.

2 个答案:

答案 0 :(得分:1)

您无法访问上一次加入中的TAB1,因为它位于FROM之外。因此,请为结果集提供别名TAB2并使用它在上一次加入中,您必须将MD1MessageMaster更改为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;
相关问题