Mysql “SQL左连接”;不支持联接表达式";

Mysql “SQL左连接”;不支持联接表达式";,mysql,sql,ms-access,Mysql,Sql,Ms Access,这个问题与我在Sparx网站上提出的问题有关。他们建议我试试StackOverflow,所以我来了。在发布到Sparx网站之前,我已经试着对这个问题做了大量的研究。我稍微调整了一下,使它更像是一个一般的SQL问题,而不是我正在使用的工具 我不是SQL大师,所以请善待我 形势 我有两个表,其中包含以下元素 表t\u对象 ------ 对象\u ID自动编号 对象类型文本 名称文本 ParentID编号 表t\U操作 ---------------- 操作ID自动编号 对象标识号 名称文本 tabl

这个问题与我在Sparx网站上提出的问题有关。他们建议我试试StackOverflow,所以我来了。在发布到Sparx网站之前,我已经试着对这个问题做了大量的研究。我稍微调整了一下,使它更像是一个一般的SQL问题,而不是我正在使用的工具

我不是SQL大师,所以请善待我

形势
我有两个表,其中包含以下元素

表t\u对象

------

对象\u ID自动编号

对象类型文本

名称文本

ParentID编号

表t\U操作

----------------

操作ID自动编号

对象标识号

名称文本

table t_对象包含许多不同类型的项。对象ID是唯一的密钥。我感兴趣的项目是Object_Type='class'或'activity'或'activityparameter'。名称是项目的名称。ParentID仅适用于“activityparameter”项,并且是“activityparameter”所属的“活动”的对象ID

表t_操作包含属于一个类的所有操作。OperationID是唯一的密钥。Object_ID是该操作如何链接到其在t_对象中的类

问题
在我们的系统中,所有类都有一个同名活动,属于一个类的所有操作都有一个属于该活动的同名activityparameter

我试图找到错误的条目,其中类MyClass中的操作MyOp没有在活动MyClass中具有相同名称的activityparameter MyOp

使用下面的测试数据

t\u对象

+-------------+-------------+--------+-------------+

|对象| ID |对象|类型|名称|父ID |

+-------------+-------------+--------+-------------+

|1 | Class | c1 | 0 |

| 2 | Class | c2 | 0 |

| 3 |活动| c1 | 0 |

| 4 |活动| c2 | 0 |

| 5 |活动参数| MyOp1 | 3 |

| 6 |活动参数| MyOp2 | 3 |

| 7 |活动参数| MyOp3 | 3 |

| 8 |活动参数| MyOp1 | 4 |

| 9 |活动参数| MyOp2 | 4 |

+-------------+-------------+--------+--------+-------------+

t\u操作

+------+------+------+

|操作ID |对象ID |名称|

+------+------+------+

|1 | 1 | MyOp1 |

| 2 | 1 | MyOp2 |

| 3 | 2 | MyOp1 |

| 4 | 2 | MyOp2 |

| 5 | 2 | MyOp3 |

| 6 | 2 | MyOp4 |

+------+------+------+

以上表格代表以下内容:

操作c1::MyOp1(来自c1类)

操作c1::MyOp2(来自类别c1)

操作c2::MyOp1(来自c2类)

操作c2::MyOp2(来自c2类)

操作c2::MyOp3(来自c2类)

操作c2::MyOp4(来自c2类)

活动参数c1::MyOp1(来自活动c1)

活动参数c1::MyOp2(来自活动c1)

活动参数c1::MyOp3(来自活动c1)

活动参数c2::MyOp1(来自活动c2)

活动参数c2::MyOp2(来自活动c2)

我们可以看到以下错误

操作c2::MyOp3没有等效的活动参数

操作c2::MyOp4没有等效的活动参数

活动参数c1::MyOp3没有等效操作

就这个问题而言,我对最后的错误不感兴趣。当我得到“operation class::operation没有等效的活动参数”的SQL查询时,我将拥有执行相反操作的逻辑

我尝试了SQL查询(我正在使用Access和MySQL)。注意,文本搜索不区分大小写。如果活动参数属于所述活动,则SELECT末尾的两个ID应相等。如果它们不同,则返回的活动参数属于不同的活动。这起到了快速交叉检查的作用

SELECT o_class.name, o_operation.name, o_activity.name, o_actparam.name, o_activity.object_ID AS "activity ID", o_actparam.parentID AS "belongs to activity ID"  
FROM  
(((  
t_object o_class  
INNER JOIN t_object o_activity ON  
    (   o_activity.name = o_class.name  
       AND  
       o_class.object_type = 'class'  
       AND  
       o_activity.object_type = 'activity'  
    )  
)  
INNER JOIN t_operation o_operation ON o_operation.object_id = o_class.object_id)  
LEFT JOIN t_object o_actparam ON  
    (   o_actparam.name = o_operation.name  
        AND  
        o_actparam.object_type = 'activityparameter'  
        AND  
        o_actparam.parentid = o_activity.object_id  
    )  
)  
WHERE  
    o_actparam.name is NULL  
ORDER BY  
    o_class.name, o_operation.name, o_activity.name, o_actparam.name, o_activity.object_ID, o_actparam.parentID  
上面的目的是获取一个类,然后是一个具有相同名称的活动,然后是属于该类的所有操作,然后对每个
操作尝试在该活动中找到一个具有相同名称的活动参数。任何不匹配的操作都应该返回NULL(因为它是左连接),因此WHERE语句显示没有相关activityparameter的操作,即错误

上述方法不起作用;我得到一个“不支持连接表达式”

如果我去掉“o_actparam.parentid=o_activity.object_id”,那么它根本不会返回任何结果这显然是错误的。我认为这是因为左连接匹配第一个表达式,即“o_actparam.name=o_operation.name”,然后将任何其他表达式应用于该结果。因此,它返回10行(c2::MyOp4返回一个NULL),但第二个表达式(o_actparam.object_type='activityparameter'
LEFT JOIN t_object o_actparam ON  
    (   o_actparam.name = o_operation.name  
        AND  
        (   o_actparam.object_type = 'activityparameter'  
            OR  
            o_actparam.object_type is NULL  
        )  
    )  
)  
c2::MyOp4
WHERE  
    o_actparam.parentid <> o_activity.object_id  
OR  
    o_actparam.parentid is NULL  
c1::MyOp1
c1::MyOp2
c2::MyOp1
c2::MyOp2
c2::MyOp3
c2::MyOp4
LEFT JOIN t_object o_actparam ON  
    o_actparam.name + o_actparam.object_type + o_actparam.parentid = o_operation.name + 'activityparameter' + o_activity.object_id  
) 
(SELECT * FROM
) AS q1
SELECT o_class.name, o_operation.name, o_activity.name, o_actparam.name, o_activity.object_ID AS "activity ID", o_actparam.parentID AS "belongs to activity ID"  
FROM  
(
    (SELECT * FROM
    ((  
    t_object o_class  
    INNER JOIN t_object o_activity ON  
        (   o_activity.name = o_class.name  
           AND  
           o_class.object_type = 'class'  
           AND  
           o_activity.object_type = 'activity'  
        )  
    )  
    INNER JOIN t_operation o_operation ON o_operation.object_id = o_class.object_id)  
    ) AS q1

LEFT JOIN t_object o_actparam ON  
    (   o_actparam.name = q1.o_operation.name  
        AND  
        o_actparam.object_type = 'activityparameter'  
        AND  
        o_actparam.parentid = q1.o_activity.object_id  
    )  
)  
WHERE  
    o_actparam.name is NULL  
ORDER BY  
    o_class.name, o_operation.name, o_activity.name, o_actparam.name, o_activity.object_ID, o_actparam.parentID