【问题标题】:SQL Join returns too many rowsSQL Join 返回太多行
【发布时间】:2011-02-03 12:31:12
【问题描述】:

这是我昨天的SQL joining dilemma 的延续...

我有以下表格:

(Student)

|   ID    |  NAME   |
|  1234   |  dave   |

(Assessment)

|     ID     |    DATE    | STUDENT_ID |  TYPE  |
|     1      |  02/03/11  |    1234    | School |
|     2      |  05/03/11  |    1234    | Parent |

(Concern) 

|   ID   |  ASSESSMENT_ID  | TOPIC | LEVEL | TOPIC_NUMBER |
|    1   |         1       | apple |   3   |       1      |
|    2   |         1       | pears |   2   |       2      |
|    3   |         2       | mango |   2   |       1      |
|    4   |         2       | dates |   4   |       2      |

我想创建一个组合评估和关注点的单行:

| StudentId | TIoC1 | TIoC2 | TIoCScore1 | TIoCScore2 | PIoC1 | PIoC2 | PIoCScore1 | PIoCScore2 |
|   1234    | apple | pears |      3     |      2     | mango | dates |      2     |       4    |

这是要导出到一个统计包,所以结构必须保持原样。

这是我现在的 SQL:

SELECT a_assessment.StudentId, 
TIoC1,TIoC2,TIoCScore1,TIoCScore2,PIoC1,PIoC2,PIoCScore1,PIoCScore2
FROM
  dbo.Assessment a_assessment
  LEFT OUTER JOIN
  (
    SELECT P.StudentId, C1.Topic AS TIoC1, C2.Topic AS TIoC2, C3.Topic AS TIoC3, C4.Topic AS TIoC4,
      C1.Level AS TIoCScore1, C2.Level AS TIoCScore2, C3.Level AS TIoCScore3, C4.Level AS TIoCScore4
    FROM dbo.Assessment P
      LEFT JOIN Concern C1 ON P.Id = C1.Assessment_Id and C1.TopicNumber = 1
      LEFT JOIN Concern C2 ON P.Id = C2.Assessment_Id and C2.TopicNumber = 2
    WHERE P.Type = 'School'
  ) a_school_cons
  ON a_school_cons.StudentId = a_assessment.StudentId
  LEFT OUTER JOIN
  (
    SELECT P.StudentId, C1.Topic AS PIoC1, C2.Topic AS PIoC2
      C1.Level AS PIoCScore1, C2.Level AS PIoCScore2
    FROM dbo.Assessment P
      LEFT JOIN Concern C1 ON P.Id = C1.Assessment_Id and C1.TopicNumber = 1
      LEFT JOIN Concern C2 ON P.Id = C2.Assessment_Id and C2.TopicNumber = 2
    WHERE P.Type = 'Parent'
  ) a_parent_cons
ON a_parent_cons.StudentId = a_assessment.StudentId

问题是,它返回两个相同的行!

| StudentId | TIoC1 | TIoC2 | TIoCScore1 | TIoCScore2 | PIoC1 | PIoC2 | PIoCScore1 | PIoCScore2 |
|   1234    | apple | pears |      3     |      2     | mango | dates |      2     |       4    |
|   1234    | apple | pears |      3     |      2     | mango | dates |      2     |       4    |

我不知道如何更新它以只返回一个 - 任何帮助都非常感激!

一如既往的感谢!

【问题讨论】:

  • 您还可以查看我对您提到的原始问题的回答的编辑版本。编辑答案时可能不会向 OP 发送通知,因此您只是错过了它。
  • 谢谢安德烈,我没有收到通知。我今天将测试您的分组建议 - 感谢您的所有帮助!

标签: sql sql-server join


【解决方案1】:

在这里添加一个简单的DISTINCT 不起作用吗?

【讨论】:

  • 是的!我已经看这个太久了 - 不敢相信我没有想到这一点 - 非常感谢!
  • 并不是说这看起来是性能最高的查询,但DISTINCT 会给您带来更多性能问题...
  • @ck 这是一个很少运行(
【解决方案2】:

FROM Student LEFT JOIN...代替FROM Assessment LEFT JOIN...

您只需要 StudentID 列,但评估中的 2 行正在重新计算您的两行。

【讨论】:

  • 谢谢,我将把它包含在重构中!
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 2021-05-29
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多