Mysql 理解内部联接或左联接的问题

Mysql 理解内部联接或左联接的问题,mysql,outsystems,Mysql,Outsystems,我在理解内部连接和左连接时遇到问题 我在outsystems中有以下查询 SELECT {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments] , {CLD}.[LastUpdateOn],min({Project}.[Number]) ,count({Project}.[Number]) FROM {CLD} INNER JOIN {Project} ON {Project}.[Id] = {CLDProjects}.[Pr

我在理解内部连接和左连接时遇到问题

我在outsystems中有以下查询

 SELECT {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments]
      , {CLD}.[LastUpdateOn],min({Project}.[Number])
      ,count({Project}.[Number])
 FROM {CLD}
     INNER JOIN {Project} ON  {Project}.[Id] = {CLDProjects}.[ProjectId] 
     INNER JOIN {CLDProjects} ON {CLD}.[Id] = {CLDProjects}.[CLDId]
 WHERE 
   (
     @IsJAXPM =1 
     or EXISTS (SELECT 1 
             FROM {CLDParticipant} 
             WHERE {CLDParticipant}.[CLDId] = {CLD}.[Id] 
               AND {CLDParticipant}.[UserId] = @UserId) 
     or EXISTS (SELECT 1 
                FROM {ProjectParticipantWidget} 
                    INNER JOIN {ProjectParticipant} ON {ProjectParticipantWidget}.[ProjectParticipantId] =  {ProjectParticipant}.[Id]
                WHERE {ProjectParticipant}.[ProjectId] = {Project}.[Id] 
                  AND {ProjectParticipant}.[UserId] = @UserId)
   )
 GROUP BY {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments], {CLD}.[LastUpdateOn]
问题是Select正在拉取与项目无关的所有CLD元素,我正在尝试选择其项目id=Project.id的CLD。我尝试了两个连接,但它一直拉所有的值 下面是结构的外观

请尝试以下操作:首先获取与项目匹配的CLD项目,然后从匹配的记录中获取CLD

FROM {CLD} INNER JOIN (
    {CLDProjects} INNER JOIN {Project} ON  {Project}.[Id] = {CLDProjects}.[ProjectId]
  ) ON {CLD}.[Id] = {CLDProjects}.[CLDId]

您可能缺少ProjectParticipant子查询中CLDProjects的内部联接。加

INNER JOIN {CLDProjects} ON {ProjectParticipant}.[ProjectId] =  {CLDProjects}.[ProjectId])
在第二个EXISTS联接条件上,否则第二个结果将与用户所在的每个项目的EXISTS匹配,忽略CLDProjects上的其他条件。请尝试以下操作:

SELECT {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments]
      , {CLD}.[LastUpdateOn],min({Project}.[Number])
      ,count({Project}.[Number])
 FROM {CLD}
     INNER JOIN {Project} ON  {Project}.[Id] = {CLDProjects}.[ProjectId] 
     INNER JOIN {CLDProjects} ON {CLD}.[Id] = {CLDProjects}.[CLDId]
 WHERE 
   (
     @IsJAXPM =1 
     or EXISTS (SELECT 1 
             FROM {CLDParticipant} 
             WHERE {CLDParticipant}.[CLDId] = {CLD}.[Id] 
               AND {CLDParticipant}.[UserId] = @UserId) 
     or EXISTS (SELECT 1 
                FROM {ProjectParticipantWidget} 
                    INNER JOIN {ProjectParticipant} ON {ProjectParticipantWidget}.[ProjectParticipantId] =  {ProjectParticipant}.[Id]

                    INNER JOIN {CLDProjects} ON {ProjectParticipant}.[ProjectId] =  {CLDProjects}.[ProjectId]

                WHERE {ProjectParticipant}.[ProjectId] = {Project}.[Id] 
                  AND {ProjectParticipant}.[UserId] = @UserId)
   )
 GROUP BY {CLD}.[Id], {CLD}.[Name], {CLD}.[Comments], {CLD}.[LastUpdateOn]
还有。。确保您没有将@IsJAXPM作为1传递。。。否则它肯定会返回所有记录。
让我们知道这是否有效。否则,请扩展图表以显示ProjectParticipant和ProjectParticipantWidget表。

我认为您只需要重新排序联接,我试图复制您的案例(联接顺序不正确),但在测试查询时出现错误


但是,如果您对联接重新排序,它会起作用。注意,我使用的是OutSystems 10

您的连接条件看起来有点混乱,我甚至不知道您可以从后面的连接中引用表。(…使用
{
}
?)您可以从以后的联接中引用表(因为SQL将联接混合在一起以进行优化),但我同意这样读起来确实很难。为了便于阅读,CLDProjects应该在Project之前。至于{},他们允许OutSystems平台扩展到虚拟表名,即数据库中的有效物理表名。那些被上帝摧毁的人首先使用具有特定于供应商的“增强”的开发工具,我尝试了上面的连接,但它仍然会拉动所有东西,然后我会尝试移除要测试的部分,看看它会返回什么。在上面的内部连接之后,它应该不重要,但是我只是注意到在你的位置有一个ORs。确保哪里不会引起这种情况。奇怪的是,上面的内部联接确保源记录集包含和只包含匹配项目的CLD项目匹配的CLD。