我使用THEATRES
设置THEATRES.NUMOFROWS, THEATRES.NUMOFCOLS
的大小,并将每个SEAT.SEATNO
绑定到THEATRES.ID
,将SHOWTIMES.ID
绑定到THEATRES.ID
和{{ 1}}与TICKET_ITEMS
我想通过使用SHOWTIMES.ID
的where子句加入表来显示所有值。我知道外部联接在不匹配时将显示null,但是我的查询仅显示一条记录。
showtime.id
;
答案 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.ID
是1
的行,其中有连接的行,而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