Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在两列上用空格连接三个表,空格不为';不匹配_Sql_Sql Server_Join - Fatal编程技术网

Sql 在两列上用空格连接三个表,空格不为';不匹配

Sql 在两列上用空格连接三个表,空格不为';不匹配,sql,sql-server,join,Sql,Sql Server,Join,我试图在两个不同的列上连接三个表,但要注意的是,当某些列不匹配时,我希望有空格。这些表包含数学和英语测试的数据,因此我将基于一个公共测试列的两个测试表与一个通过ID列的学生表连接起来,这两个测试表都有共同点 正如您将从下面的图像中看到的,在某些情况下,同一个测试同时包含数学和英语,因此这会出现在两个表中,但在其他情况下,会编写单独的测试 这三个表格是: 正如你所看到的,MEG10测试是由英语和数学共同进行的,因为它们是一起写的,并且在同一个测试中。这就是我被绊倒的地方,因为我希望当测试以英

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

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

这三个表格是:

正如你所看到的,MEG10测试是由英语和数学共同进行的,因为它们是一起写的,并且在同一个测试中。这就是我被绊倒的地方,因为我希望当测试以英语和数学形式出现时,连接显示所有结果。但是,当测试分开时,我希望它在英语或数学栏中分别用空格和“stuff”(因为那些应该是空白栏的栏中实际上没有信息)。本质上,当我加入它们时,我希望结果表是如下所示的表

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

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%';
这给了我:

现在,我知道我加入了测试专栏,这意味着我应该只得到他们共享的测试,但我不确定如何加入,以便得到我想要的结果。此外,我知道我只是从数学表中选取测试列,但我不想要两个测试列


我肯定有办法做到这一点,我只是不知道如何做到。如果我需要澄清我的问题,请让我知道。

你需要一份所有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%'
运行它并理解输出

然后你把它和名字连接起来,然后像这样把它和测试连接起来

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%'

您可以使用
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%';

提示:将数学表和英语表合并在一起可能会简化数据库设计。将信息分成两个结构相同的表有什么好处?当更多的主题参与进来时,它将如何扩展?你可以使用一个唯一的表,再加上一列来存储主题的名称(数学、英语等)。

只要将两个连接都改为左连接,如果我这样做,它会在名称列中给我一堆空值。虽然结构相似,但它们唯一的共同点是Test和ID列,否则,英语和数学成绩在那次考试中是独一无二的。基本上,如果我合并它们,那么90%的单元格将为空。这是合理的理由吗?“我的数据库设计经验并不丰富。”德雷克默多克:我明白。在这种情况下,最好使用两个单独的表。这只是根据您提供的示例数据得出的提示。@DrakeMurdoch:您是否有机会测试上述
完全外部联接
查询?当我这样做时,它在ID和测试列上显示“无列名”。你知道为什么吗?@DrakeMurdoch:请看看答案中查询的当前版本。我为
ID
Test
添加了列标题。除了列标题之外,您是否在resultset中获得了正确的数据?您知道为什么我在ID和Test列中获得了一些空值吗?@DrakeMurdoch——这就是sql处理左连接的方式。如果需要,只需将空字符串转换为空字符串。