从表1中删除部分并显示表2中的部分

时间:2018-01-18 10:12:45

标签: mysql teradata

我有一个SQL问题,正在使用Teradata。 我有2个表,分别称为Class,Table 1和Grades,表2。 从表1中我想从一年级等特定班级中提取一组特定的学生,并显示一些额外的数据。 对于表1中的数据,我想要添加来自特定主题的成绩,但并非所有学生都在考虑这个主题,对于他们我希望得到一个NULL结果。

我知道如何只与接受主题的学生一起获取数据,但后来我想念其他学生。

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')
    ;

2 个答案:

答案 0 :(得分:2)

您需要创建一个名为Subjects的单独表,然后加入Subject / ID。这样你可以用名字替换数字。或者你可以使用IF(b.subject = 1,'English',IF(b.subject = 2,'History',IF(b.subject = 3,'Science'))),但这不适合很多科目。

WHERE位是你的问题。你需要将它放在LEFT JOIN上,这样你的查询就会显示如下:

ON a.name = b.name AND subject = 2

试试......

通过限制JOIN,您仍然可以返回其他行 - 在连接发生后发生WHERE,从而导致您没有看到所有学生。

答案 1 :(得分:0)

您的查询使用IN但您不需要它。修复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的部分,您必须在查询中引入另一个连接