【问题标题】:How to write CASE statement with condition on values from Sub-query in SQLite如何在 SQLite 中的子查询中编写带有条件的 CASE 语句
【发布时间】:2017-08-02 07:52:41
【问题描述】:

Highschooler 表包含以下格式的数据:

高中生(身份证、姓名、年级)

英语:某年级有一个具有唯一ID和给定名字的高中生。

表中的样本数据为:

ID       NAME      GRADE
1510    Jordan      9
1689    Gabriel     9
1381    Tiffany     9
1709    Cassandra   9
1101    Haley       10
1782    Andrew      10
1468    Kris        10

likes 表的数据格式如下:

赞(ID1、ID2)

英文:ID1 的学生喜欢 ID2 的学生。喜欢某人不一定是相互的,因此如果 (123, 456) 在 Likes 表中,则不能保证 (456, 123) 也存在。

Likes表中的样本数据如下:

ID1      ID2
1689    1709
1709    1689
1782    1709
1911    1247
1247    1468
1641    1468
1316    1304
1501    1934
1934    1501
1025    1101

现在我的问题是:

对于喜欢比自己小 2 个或更多年级的人的每个学生,返回该学生的姓名和年级,以及他们喜欢的学生的姓名和年级。

为了实现这一点,我编写了以下查询,我可以在其中获取学生、liked_student 和他们的成绩的数据。我要做的是减去 Liked_student 和 Student 自己的成绩,如果成绩 >= 2,然后我输出学生的详细信息。这种检查成绩是我在失败的 CASE 语句中尝试做的。

当我执行内部查询时,子查询运行没有任何问题,这意味着我能够获取学生的所有详细信息。子查询结果如下:

 DIFFERENCE STUDENT_GRADE STUDENT_NAME STUDENT_LIKED_GRADE STUDENT_LIKED_NAME

    0         9           Cassandra          9         Gabriel
    0         9           Gabriel            9         Cassandra
    1         10          Andrew             9         Cassandra
    2         12          John               10        Haley

它只是在 CASE 语句中给出一个错误

错误代码:1109。字段列表中的未知表“INTER1”

    SELECT CASE WHEN INTER1.GRADE_DIFFERENCE >= 2 THEN 
        (SELECT INTER1.* FROM
        (SELECT (H1.grade-H2.grade) AS GRADE_DIFFERENCE, 
                 H1.grade AS STUDENT_GRADE, 
                 H1.name AS STUDENT_NAME, 
                 H2.grade AS STUDENT_LIKED_GRADE, 
                 H2.name AS STUDENT_LIKED_NAME
         FROM Highschooler H1
         INNER JOIN Likes L
         ON H1.ID = L.ID1
         INNER JOIN Highschooler H2 
         ON H2.ID = L.ID2) INTER1)
         END

我怎样才能做到这一点?我已经尝试过 IF...THEN 但无法使其工作。

请帮助。

【问题讨论】:

  • 请提供一些示例数据和您想要的输出。 (请参阅How to format SQL tables in a Stack Overflow post? 了解如何添加。)
  • @CL。我已按照建议添加了详细信息。如果您想了解更多详细信息,我会合并它们。谢谢。
  • 假设内部查询的输出是一个表。您将如何检索difference 列至少为两个的行?
  • 从 DIFFERENCE >=2 的 TABLE 中选择 STUDENT_GRADE、STUDENT_NAME、STUDENT_LIKED_GRADE、STUDENT_LIKED_NAME
  • @CL。想通了....

标签: sqlite subquery case-expression


【解决方案1】:

这给出了所需的答案:

SELECT INTER1.STUDENT_GRADE, 
       INTER1.STUDENT_NAME, 
       INTER1.STUDENT_LIKED_GRADE,
       INTER1.STUDENT_LIKED_NAME 
       FROM 
       (SELECT (H1.grade-H2.grade) AS GRADE_DIFFERENCE, 
                H1.grade AS STUDENT_GRADE, 
                H1.name AS STUDENT_NAME, 
                H2.grade AS STUDENT_LIKED_GRADE, 
                H2.name AS STUDENT_LIKED_NAME
        FROM Highschooler H1
        INNER JOIN Likes L
        ON H1.ID = L.ID1
        INNER JOIN Highschooler H2 
        ON H2.ID = L.ID2) INTER1
        WHERE INTER1.GRADE_DIFFERENCE >=2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 2018-09-13
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多