sql - 如何进行完全外部联接
问题描述
我THEATRES
使用设置大小THEATRES.NUMOFROWS, THEATRES.NUMOFCOLS
,每个都SEAT.SEATNO
被绑定到THEATRES.ID
,SHOWTIMES.ID
被绑定到THEATRES.ID
,TICKET_ITEMS
被绑定到SHOWTIMES.ID
我想通过使用 where 子句加入表来显示所有值showtime.id
。我知道外部联接将在不匹配时显示 null,但我的查询仅显示一条记录。
SELECT
SHOWTIMES.ID AS SHOWTIMESID,
SHOWTIMES.THEATREID,
THEATRES.THEATRENAME,
THEATRES.NUMOFROWS,
THEATRES.NUMOFCOLS,
SEAT.SEATNO AS SEATLABEL,
SEAT.ROWID,
SEAT.COLUMNID,
TICKET_ITEMS.SEATNO,
TICKET_ITEMS.TICKETCODE
FROM
SHOWTIMES FULL OUTER JOIN TICKET_ITEMS ON SHOWTIMES.ID =TICKET_ITEMS.SHOWTIMESID
FULL OUTER JOIN THEATRES ON SHOWTIMES.THEATREID = THEATRES.ID
FULL OUTER JOIN SEAT ON SEAT.SEATNO = TICKET_ITEMS.SEATNO
WHERE
SHOWTIMES.ID = 1
;
解决方案
如果您使用任何一种,OUTER JOIN
并且您引用了WHERE
您需要处理的列中的NULL
s。如果你不这样做,你把它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 行,其中 1 行表示 where T1.ID
is1
有连接行,1 行表示T1.ID
is 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
来处理:
WHERE SHOWTIMES.ID = 1 OR SHOWTIMES.ID IS NULL;
推荐阅读
- c - 在 while 循环之前定义变量或在循环中定义为静态变量
- google-cloud-platform - 两个表之间的 BigQuery 差异
- java - 混合 scala/java gradle 项目无法正确加载依赖项
- php - FFMPEG“无法分配内存”通过php出错
- javascript - 将 function.toString() 与编译器一起使用?
- html - 当长度达到四时,在新容器 div 中显示 ngFor 数据
- objective-c - Unhold GSM 通话后,Callkit 变成静音,我听不到任何声音
- php - 我的 Api 返回错误“请求没有匹配的路由”。连同我要求的所有数据
- javascript - 根据javascript中的另一个数字返回一个不断增长的数字
- python - 此 TensorFlow 二进制文件使用 Intel(R) MKL-DNN 进行了优化,可在性能关键的情况下使用以下 CPU 指令