1

我正在学习加入并有以下表格。

学生

| ID | NAME |
-------------
|  1 |    A |
|  2 |    B |
|  3 |    C |
|  4 |    D |

经过

| ID | MARKS |
--------------
|  2 |    80 |
|  3 |    75 |

失败

| ID | MARKS |
--------------
|  1 |    25 |
|  4 |    20 |

我想要的输出是这样的:

| NAME | MARKS |
----------------
|    B |    80 |
|    C |    75 |
|    A |    25 |
|    D |    20 |

我写了一个这样的查询:

select s.id,s.name,p.marks from student s 
left join pass p on s.id=p.id 
left join  (select f.marks,f.id from fail f ) as nn on s.id=nn.id 
order by marks desc;

我得到的输出是这样的:

| id | name | Marks| 
--------------------
| 1  |   B  |  80  |
| 2  |   C  |  75  |
| 3  |   A  | Null |
| 4  |   D  | NUll |

无法弄清楚为什么 Null 来了。任何指针?

4

4 回答 4

0

试试下面的查询,使用COALESCE

select s.id,s.name,COALESCE(p.marks , nn.marks) as marks
from student s 
left join pass p on s.id=p.id 
left join fail nn on s.id=nn.id 
order by marks desc;

SQL小提琴

于 2013-04-27T07:20:02.077 回答
0

您只选择通过的分数,这就是 null-s 出现在失败结果附近的原因。如果要选择失败的标记,可以使用IF条件

select s.id,s.name,IF(p.marks = null, nn.marks, p.marks) as markss
from student s 
left join pass p on s.id=p.id 
left join fail nn on s.id=nn.id 
order by markss desc;

或者您可以使用union通过和失败的结果。

select s.id,s.name, u.marks
from student s 
left join ( (SELECT * FROM pass) UNION (SELECT * FROM fail) ) as n ON n.id = s.id
order by marks desc;
于 2013-04-27T07:23:34.480 回答
0

您可以CASE为此使用语句:

SELECT Name,
CASE WHEN P.Marks IS NULL THEN f.Marks ELSE P.Marks END AS Marks
FROM Student s
LEFT JOIN Pass p ON s.ID = p.ID
LEFT JOIN Fail f ON s.ID = f.ID
ORDER BY Marks DESC;

或者你也可以使用IF语句:

SELECT Name,
IF(P.Marks IS NULL, F.Marks, P.Marks) AS Marks
FROM Student s
LEFT JOIN Pass p ON s.ID = p.ID
LEFT JOIN Fail f ON s.ID = f.ID
ORDER BY Marks DESC;

输出

| NAME | MARKS |
----------------
|    B |    80 |
|    C |    75 |
|    A |    25 |
|    D |    20 |

看到这个 SQLFiddle

要了解有关 JOIN 的更多信息,请参阅:SQL 连接的可视化解释

于 2013-04-27T07:26:35.340 回答
0

您需要了解不同的连接是如何工作的,以了解您收到NULLmarks列的原因。看看这里:SQL 连接的可视化解释

您的相关示例是:

左外连接:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

在此处输入图像描述

  • 您收到的该marks列的 Null 值是左连接表中不匹配的行。
  • (维恩图的左侧)确实有值的值是维恩图的两个组之间的横截面。

您的示例的详细信息:

select s.id,s.name,p.marks 
from student s 
left join pass p on s.id=p.id 
left join  (select f.marks,f.id from fail f ) as nn on s.id=nn.id 
order by marks desc;
The output i got is this:

id | name | Marks
-------------------
1  |  B   | 80
2  |  C   | 75
3  |  A   | Null
4  |  D   | NUll

这将在何时返回所有学生行。

  • 通过 gtade 的学生将显示成绩,没有通过的学生将显示 null。
于 2013-04-27T07:27:58.613 回答