去掉表1的一部分并显示表2的一部分

t0ybt7op  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(441)

我在使用teradata时遇到了sql问题。我有两张表,分别是班级表1和年级表2。从表1中,我想从一个特定的班级、一年级等中抽取一组特定的学生,并展示一些额外的数据。在表1的数据中,我想加上一个特定科目的成绩,但不是所有的学生都选这个科目,我想给他们一个空的结果。
我知道如何只和选修这门课的学生一起获取数据,但我却错过了其他学生。

SELECT
a.Name
a.Age
b.Subject
b.grade

FROM  Table1 a                                 
LEFT JOIN Table2  b ON a.name=b.name

WHERE a.group in ('1')
AND b.subject in ('2')
;

另外,我知道科目1=英语,2=历史,3=数学,所以我想把数字换成实际的名字。
部分数据:

Table1                  Table2      
Group   Name    Age         Name    Subject Grade
1       Anna    12          Anna    1       A
1       Bengt   11          Anna    2       B
1       Cesar   12          Bengt   1       A
2       David   12          Bengt   2       A
2       Eric    13          Bengt   3       C
2       Filip   12          Cesar   1       C
3       Gustav  14          Cesar   3       C
3       Hugo    14          Cesar   4       B
3       Inga    14          Cesar   5       A

我得到的是:

Name    Age Subject Grade
Anna    12  2       B
Bengt   11  2       A

我想要的是:

Name    Age Subject Grade
Anna    12  History B
Bengt   11  History A
Cesar   12

拜托,谁能帮帮我。
最终sql

SELECT
    DISTINCT(a.Name)
    a.Age
    (CASE When b.scan_type_cd in ('2') then 'History' else NULL END) AS History,
    b.grade

    FROM  Table1 a                                 
    LEFT JOIN Table2  b ON a.name=b.name AND b.scan_type_cd in ('2')

    WHERE a.group in ('1')
    ;
5q4ezhmt

5q4ezhmt1#

您需要创建一个名为subjects的单独表,然后在subject/id上连接。这样您就可以用名称替换数字。或者你可以使用 IF(b.subject = 1,'English',IF(b.subject = 2,'History',IF(b.subject = 3,'Science'))) 但这不是很适合很多科目。
这个 WHERE 这是你的问题。您需要将其放在左连接上,这样您的查询将如下所示: ON a.name = b.name AND subject = 2 试试看。。。
通过限制join,您仍然返回其他行-where发生在join发生之后,因此您没有看到所有的学生。

8oomwypt

8oomwypt2#

您的查询正在中使用,但您不需要它。按如下所示修复where部分,并查看其是否按预期工作:

SELECT
a.Name
a.Age
b.Subject
b.grade

FROM  Table1 a                                 
LEFT JOIN Table2  b ON a.name=b.name

WHERE a.group='1'
AND b.subject='2';

对于显示主题的名称而不是ID的部分,您必须在查询中引入另一个联接

相关问题