将两列中的三个表连接在一起,空白处不匹配

时间:2019-03-22 21:10:20

标签: sql sql-server join

我试图在两个不同的列上连接三个表,但要注意的是,当某些列不匹配时,我希望有空白。这些表包含有关数学和英语测试的数据,因此我将两个基于共同测试列的测试表与一个学生表(通过ID列)结合在一起,这两个表均具有共同点。

从下面的图片中可以看到,在某些情况下,同一测试同时包含数学和英语,因此这两个表中均会出现,但是在其他情况下,将编写单独的测试。

这三个表是:

Student Table

English Test Table

Math Test Table

如您所见,MEG10测试在英语和数学之间共享,因为它们是一起编写的,并且在同一测试中。这是我要绊倒的地方,因为当测试以英语和数学形式出现时,我希望联接显示所有结果。但是,当测试分开进行时,我希望它在English或Math列中带有“ stuff”的空格(因为在那些应该空白的列中实际上没有信息)。本质上,当我加入他们时,我希望结果表如下所示。

enter image description here

我用来加入它们的代码是:

SELECT 
    m.ID, m.Test, m.M_Col1, m.M_Col2, m.M_Col3,
    e.E_Col1, e.E_Col2, e.E_Col3,
    s.First, s.Last
FROM M_Table AS m
INNER JOIN E_Table AS e ON (m.Test = r.Test)
JOIN S_Table AS s ON (m.ID = s.ID AND e.ID = s.ID)
WHERE m.Test LIKE '%2013%';

这给了我

Results that I am getting from my JOIN

现在,我了解到我正在加入“测试”列,这意味着我应该只获得它们都共享的测试,但是我不确定如何加入它,以便获得所需的结果。而且,我知道我只是从数学表中获取测试列,但我不希望有两个测试列。

我确定有办法做到这一点,但我不确定如何做到。如果我需要澄清我的问题,请告诉我。

2 个答案:

答案 0 :(得分:1)

您需要所有ID和测试的列表-您可以像这样

SELECT m.ID, m.Test FROM Math_Table as M
UNION
SELECT e.ID, e.Test FROM English_Table as E

运行并理解输出

然后您将其加入到名称中,然后将其加入这样的测试中

SELECT m.ID, m.Test, m.M_Col1, m.M_Col2, m.M_Col3, e.E_Col1, e.E_Col2, e.E_Col3, s.First, s.Last
FROM (
  SELECT m.ID, m.Test FROM Math_Table as M
  UNION
  SELECT e.ID, e.Test FROM English_Table as E
) as base
JOIN S_Table as S ON Base.ID = S.ID
LEFT JOIN M_Table AS m ON m.ID = base.ID AND m.Test = base.Test
LEFT JOIN E_Table AS e ON e.ID = base.ID AND e.Test = base.Test 
WHERE base.Test LIKE '%2013%'

答案 1 :(得分:1)

您可以使用FULL OUTER JOIN从数学表和英语表之间的关系的两端获取记录。基本上,FULL OUTER JOIN返回两个表中的所有记录,并在联接条件匹配时将它们合并,否则将丢失的关系的列填充到NULL中。

SELECT 
    COALESCE(m.ID, e.ID) id, COALESCE(m.Test, e.Test) Test, 
    m.M_Col1, m.M_Col2, m.M_Col3, 
    e.E_Col1, e.E_Col2, e.E_Col3, 
    s.First, s.Last
FROM M_Table AS m
FULL OUTER JOIN E_Table AS e ON m.Test = e.Test AND e.ID = e.ID
INNER JOIN S_Table AS s ON COALESCE(m.ID, e.ID) =  s.ID
WHERE COALESCE(m.Test, e.Test) LIKE '%2013%';

提示:将表合并在一起数学和英语可能会简化数据库设计。将信息拆分为两个具有相同结构的表有什么好处?当更多的主题投入使用时,它将如何扩展?您可以只使用一个唯一的表,并在表中附加一列来存储主题名称(数学,英语,...)。