如何进行完全外部联接

时间:2019-01-10 09:53:07

标签: sql sql-server

我使用THEATRES设置THEATRES.NUMOFROWS, THEATRES.NUMOFCOLS的大小,并将每个SEAT.SEATNO绑定到THEATRES.ID,将SHOWTIMES.ID绑定到THEATRES.ID和{{ 1}}与TICKET_ITEMS

绑定

我想通过使用SHOWTIMES.ID的where子句加入表来显示所有值。我知道外部联接在不匹配时将显示null,但是我的查询仅显示一条记录。

showtime.id

;

2 个答案:

答案 0 :(得分:0)

如果您使用任何类型的OUTER JOIN,并且引用了WHERE中的一列,则需要处理NULL。如果不这样做,则将JOIN转换为隐式INNER JOIN。举个简单的例子:

WITH T1 AS(
    SELECT ID, SomeString
    FROM (VALUES(1,'abc'),(2,'def')) V(ID, SomeString)),
T2 AS(
    SELECT ID, fID, AnotherString
    FROM (VALUES(1,1,'asd'),(2,1,'asdased')) V(ID, fID, AnotherString))
SELECT *
FROM T1
     LEFT JOIN T2 ON T1.ID = T2.ID
WHERE T2.AnotherString = 'asd';

可能期望在此处获得2行,其中T1.ID1的行,其中有连接的行,而T1.ID的行是{{1} },但没有连接的行。由于2,情况并非如此。正确的解决方案是将WHERE移至WHERE

ON

使用现有的表时,就无法使用现有的东西,因此您需要通过将WITH T1 AS( SELECT ID, SomeString FROM (VALUES(1,'abc'),(2,'def')) V(ID, SomeString)), T2 AS( SELECT ID, fID, AnotherString FROM (VALUES(1,1,'asd'),(2,1,'asdased')) V(ID, fID, AnotherString)) SELECT * FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID AND T2.AnotherString = 'asd'; 更改为以下内容来处理NULL

WHERE

答案 1 :(得分:0)

我想您的数据库已设置了正确的外键关系-因此,一个表中的剧院ID是有效的ID。

如果是这样,则不需要full join。实际上,很少需要它。我怀疑内部联接就足够了(但这就是您得到的结果)。

如果您希望所有的剧院都进行适当的演出(如果有的话),请使用left join并从剧院开始:

select st.ID AS SHOWTIMESID, st.THEATREID,
       th.THEATRENAME, th.NUMOFROWS, th.NUMOFCOLS,
       s.SEATNO AS SEATLABEL, s.ROWID, s.COLUMNID,
       ti.SEATNO, ti.TICKETCODE
from theatres th left join
     showtimes st
     on st.theatreid = th.id and st.id = 1 left join
     ticket_items ti
     on st.ID =ti.showtimesid left join
     seat s
     on s.seatno = ti.seatno