1

内部結合と左結合の理解に問題があります

私はアウトシステムで以下のクエリを持っています

 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]

問題は、選択がプロジェクトに関係なくすべての CLD 要素をプルしていることです。プロジェクト ID = Project.Id の CLD を選択しようとしています。両方の結合を試しましたが、すべての値を引き続けます構造がどのように見えるかを以下に示します ここに画像の説明を入力

4

3 に答える 3

2

次のことを試してください: 最初に Project と一致する CLDProjects を取得してから、一致したレコードから CLD を取得します。

FROM {CLD} INNER JOIN (
    {CLDProjects} INNER JOIN {Project} ON  {Project}.[Id] = {CLDProjects}.[ProjectId]
  ) ON {CLD}.[Id] = {CLDProjects}.[CLDId]
于 2016-06-08T16:22:01.903 に答える
1

ProjectParticipant サブクエリで CLDProjects への内部結合が欠落している可能性があります。追加

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

2 番目の EXISTS 結合条件で、それ以外の場合、2 番目の結果は、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 テーブルも表示してください。

于 2016-06-10T16:42:40.573 に答える
0

結合の順序を変更するだけでよいと思います。(結合の順序が正しくない) ケースを再現しようとしましたが、クエリをテストするとエラーが発生します。ここに画像の説明を入力

ここに画像の説明を入力

ただし、結合の順序を変更すると機能します。OutSystems 10を使用していることに注意してください

于 2016-12-09T01:34:53.923 に答える