以下情况的SQL查询

时间:2019-02-08 10:09:03

标签: sql oracle oracle11g

我有3个表1,其中有学生详细信息2,有项目详细信息,还有3个有学生完成详细信息。

**Table 1**

Stud Id     Stud Name    
1           aaa    
2           bbb    
3           ccc

**Table 2**
Item ID Item Name       
I1      Item1       
I2      Item2       
I3      Item3   

这是我在这3个表之间放置联接时得到的。

注意:如果学生尚未完成某项,则完成表中将没有条目。

**Table 3**     
Stud Id     Item ID Completion date    
1           I1          1/1/2000    
1           I2          1/2/2000    
3           I2          3/3/2003

必需的输出

Stud Id     Item ID completion date    
2           I2          NULL    
1           I3          NULL

在此处输入代码 第三张表中没有任何条目,且完成日期为空

3 个答案:

答案 0 :(得分:0)

SELECT stud.*, itm.*, comp.*
FROM student stud, item itm
LEFT OUTER JOIN completion comp
  ON stud.id = comp.studentId AND itm.id = comp.itemId
WHERE comp.studentId IS NULL

这将从studentitem中选择在completion中没有没有条目的所有行。

基本选择是所有student和所有item叉积

外部联接连接studentitemcompletion ,而没有限制行的选择。

然后,WHERE条件将结果集限制为仅那些在外部联接之后在NULL中具有studentId completion的行(任何其他非-completion的空列将起作用。)

答案 1 :(得分:0)

我认为这可能是您要寻找的-

SELECT TempTable.StudID, TempTable.ItemID, Table3.CompletionDate FROM
(select t1.StudID, t2.ItemID
FROM 
Table1 t1 
cross join Table2 t2) TempTable 
left join Table3 ON TempTable.StudID = Table3.StudID AND TempTable.ItemID = Table3.ItemID
WHERE Table3.CompletionDate IS NULL 

答案 2 :(得分:0)

我只是这样写:

select s.student_id, c.item_id, c.completion_date
from students s cross join
     items i left join
     completion c
     on c.student_id = s.student_id and c.item_id = i.item_id
where c.completion_date is null;

cross join生成学生和项目的所有组合。 left join保留所有这些行并添加匹配的完成日期。 where子句保留不匹配项。