Sql 使用空值连接多个表

Sql 使用空值连接多个表,sql,Sql,我有两张桌子 表1 StudentID FullName HoursLogged 1 Mark Smith 1 2 Jack Lantern 2 3 Pink Hotdog 3 表2 StudentID FirstName LastName 1 Mark Smith 2 Jack Lantern 3

我有两张桌子

表1

StudentID   FullName    HoursLogged
1           Mark Smith       1
2           Jack Lantern     2
3           Pink Hotdog      3
表2

StudentID   FirstName   LastName
1              Mark      Smith
2              Jack     Lantern
3              Pink     Hotdog
4              Mike     Cantu
5              Jake     Myers
6              Nathan   Cheese
7              Peter    Jackson
我怎样才能把桌子做成这样?如果用户没有记录小时数,则记录小时数为0

StudentID   FullName    HoursLogged
1           Mark Smith             1
2           Jack Lantern           2
3           Pink Hotdog            3
4           Mike Cantu             0
5           Jake Myyers            0
6           Nathan Cheese          0
7           Peter Jackson          0

任何帮助都将不胜感激。谢谢

您可以执行
外部联接
并将空值替换为0,这是很容易实现的方法,下面是外部联接的示例

SELECT t2.StudentID ,t2.FirstName + ' '+ t2.LastName as FullName
       ISNULL(HoursLogged,0) as HoursLogged,  
FROM Table2 t2
LEFT OUTER Table1 t1 
ON t1.studentID = t2.studentID

您可以执行
外部联接
并将空值替换为0,这是您可以轻松实现的方法,下面是外部联接的示例

SELECT t2.StudentID ,t2.FirstName + ' '+ t2.LastName as FullName
       ISNULL(HoursLogged,0) as HoursLogged,  
FROM Table2 t2
LEFT OUTER Table1 t1 
ON t1.studentID = t2.studentID
请尝试以下查询:

select b.StudentID ,concat( FirstName,' ', LastName), ISNULL(HoursLogged,0) 
as HoursLogged FROM Table1 a LEFT OUTER Table2 b ON a.StudentID = b.StudentID;
请尝试以下查询:

select b.StudentID ,concat( FirstName,' ', LastName), ISNULL(HoursLogged,0) 
as HoursLogged FROM Table1 a LEFT OUTER Table2 b ON a.StudentID = b.StudentID;

这取决于您使用的数据库的类型。检查此项,并使用正确的功能

和CONCAT到CONCAT两个字符串

看起来是这样的

SELECT Ifnull(table1.studentid, table2.studentid) 
       StudentID, 
       Ifnull(table1.fullname, Concat(table2.firstname, ' ', table2.lastname)) 
       FullName, 
       Ifnull(table1.hourslogged, 0) 
       HoursLogged 
FROM   table1 
       LEFT JOIN table2 
              ON table1.studentid = table2.studentid 
而且,您的表设计看起来很糟糕,不一致。FirstName&LastName在1个表中,另一个表有FullName

最好就是这样设计(或类似的东西)

  • 学生表(StudentID、FirstName、LastName)
  • 小时记录表(学生ID,小时记录)

这取决于您使用的数据库类型。检查此项,并使用正确的功能

和CONCAT到CONCAT两个字符串

看起来是这样的

SELECT Ifnull(table1.studentid, table2.studentid) 
       StudentID, 
       Ifnull(table1.fullname, Concat(table2.firstname, ' ', table2.lastname)) 
       FullName, 
       Ifnull(table1.hourslogged, 0) 
       HoursLogged 
FROM   table1 
       LEFT JOIN table2 
              ON table1.studentid = table2.studentid 
而且,您的表设计看起来很糟糕,不一致。FirstName&LastName在1个表中,另一个表有FullName

最好就是这样设计(或类似的东西)

  • 学生表(StudentID、FirstName、LastName)
  • 小时记录表(学生ID,小时记录)

您希望将所有输出连接在一起,还是尝试合并表

如果您只是想将表合并到一个输出中,我建议您看看JOIN子句。发布了一个很棒的连接可视化。具体地说,我认为您需要一个左连接,它将合并Table1和Table2,并给您一个输出

此外,由于在表2中将全名拆分为两列,因此必须加入CONCAT。Concat将多个字符串合并为一个字符串,然后您可以使用该字符串进行比较。例如,CONCAT(“字符串1”,“字符串3”)将为您提供“字符串1字符串3”(不带引号)

还要记住,表2中的马克·史密斯似乎在他的姓氏前有一个额外的空格。要解决这个问题,请添加修剪。这将删除前导空格和尾随空格

根据谁/什么/如何组合表,名称可能仍然不完全匹配。如果只进行直接比较(Table1.col=Table2.col),那么名称必须100%匹配,包括大小写(仅供参考,我想说这在Windows托管的数据库中没有那么重要,但我非常确定它在Linux中很重要)。您可以使用LOWER或UPPER函数强制所有内容使用大写或小写

下面是我糟糕的伪代码:

SELECT Table1.StudentID, Table1.FullName, Table2.HoursLogged FROM Table1 LEFT JOIN Table2 ON CONCAT(UPPER(Table2.FirstName), " ", UPPER(Table2.LastName)) = UPPER(Table1.FullName) 选择Table1.StudentID、Table1.FullName、Table2.HoursLogged FROM Table1 LEFT JOIN Table2 ON CONCAT(UPPER(Table2.FirstName)、“”、UPPER(Table2.LastName))=UPPER(Table1.FullName) 我注意到有时候数据库会变得很挑剔,所以你必须在那里扔一些坟墓。老实说,我不知道为什么有时候这很重要,但我已经解决了过去出现的一些奇怪的问题

SELECT `Table1`.`StudentID`, `Table1`.`FullName`, `Table2`.`HoursLogged` FROM `Table1` LEFT JOIN `Table2` ON CONCAT(UPPER(`Table2`.`FirstName`), " ", UPPER(`Table2`.`LastName`)) = UPPER(`Table1`.`FullName`) 从“Table1”左键中选择“Table1”。“StudentID”,“Table1”。“FullName”,“Table2”。“HoursLogged”,在CONCAT上连接“Table2”。(UPPER(`Table2`.`FirstName`),”,UPPER(`Table2`.`LastName`)=UPPER(`Table1`.`FullName`) 编辑 完全忘记了空部分。桑托的想法是对的

SELECT Table1.StudentID, Table1.FullName, ISNULL(Table2.HoursLogged, 0) AS `HoursLogged` FROM Table1 LEFT JOIN Table2 ON CONCAT(UPPER(Table2.FirstName), " ", UPPER(Table2.LastName)) = UPPER(Table1.FullName) 选择Table1.StudentID、Table1.FullName、ISNULL(Table2.HoursLogged,0)作为“HoursLogged”,从Table1左侧连接CONCAT上的Table2(UPPER(Table2.FirstName),“”,UPPER(Table2.LastName))=UPPER(Table1.FullName) 编辑2 你知道,我又看了一遍,现在觉得自己很傻。。。如果学生们在两张桌子之间的匹配,你就不必把所有的康考特的东西都弄乱了

SELECT Table1.StudentID, Table1.FullName, ISNULL(Table2.HoursLogged, 0) AS `HoursLogged` FROM Table1 LEFT JOIN Table2 ON Table1.StudentID = Table2.StudentID 从表1中选择Table1.StudentID、Table1.FullName、ISNULL(Table2.HoursLogged,0)作为'HoursLogged',然后在表1上连接Table2.StudentID=Table2.StudentID 编辑3 贾尔是对的。 我相信连接字符串的标准是双竖条

"string 1" || "string 2" “字符串1”| |“字符串2”

修剪前导/尾随空格

trim(both ' ' from 'string 1') 修剪(从“字符串1”中删除两个“”)

左联接不是标准联接,但可以向(自然)联接添加WHERE子句

选择Table1.StudentID、Table1.FullName、Table2.HoursLogged FROM Table1、Table2,其中Table1.StudentID=Table2.StudentID ISNULL是一个并非所有数据库管理系统都支持的函数,但COALESCE似乎无处不在

SELECT Table1.StudentID, Table1.FullName, COALESCE(Table2.HoursLogged, 0) AS HoursLogged FROM Table1, Table2 WHERE Table1.StudentID = Table2.StudentID
选择Table1.StudentID、Table1.FullName、COALESCE(Table2.HoursLogged,0)作为从Table1、Table2中记录的小时数,其中Table1.StudentID=Table2.StudentID是否要将输出全部合并在一起,还是尝试合并表

如果您只是想将表合并到一个输出中,我建议您看看JOIN子句。发布了一个很棒的连接可视化。具体地说,我认为您需要一个左连接,它将合并Table1和Table2,并给您一个输出

此外,由于在表2中将全名拆分为两列,因此必须加入CONCAT。Concat将多个字符串合并为一个字符串,然后您可以使用该字符串进行比较。例如,CONCAT(“字符串1”,“字符串3”)将为您提供“字符串1字符串3”(不带引号)

还要记住,表2中的马克·史密斯似乎在他的姓氏前有一个额外的空格。要解决这个问题,请添加修剪。这将删除前导空格和尾随空格

根据谁/什么/如何组合表,名称可能仍然不完全匹配。如果只进行直接比较(Table1.col=Table2.col),那么名称必须100%匹配,包括大小写(仅供参考,我想说这在Windows托管的数据库中没有那么重要,但我非常确定它在Linux中很重要)。哟