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

合格したマークのみを選択します。これが、失敗した結果の近くに null が表示される理由です。失敗したマークを選択したい場合は、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

NULL列を受け取る理由を理解するには、さまざまな結合がどのように機能するかを理解する必要がありmarksます。こちらをご覧ください: 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 値は、左側の結合されたテーブルに一致しない行です。
  • (ベン図の左側) 値を持つ値は、ベン図の 2 つのグループ間の断面です。

あなたの例の詳細:

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 に答える
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

以下のクエリを試して、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 に答える