这些查询中哪一个是错误的,哪个是正确的(SQL)

时间:2018-02-02 09:00:06

标签: sql database

Sailor Database

所以有些人说1是错的,因为B.bid除了之外是不可访问的,我们之后不能使用它,因为这会给编译器错误

但我没有得到它,所以我们不能使用B.bid之后,但我们可以在存在后使用它?为什么呢?

哪一个是正确的查询?

1 个答案:

答案 0 :(得分:1)

查询1存在一些问题。


首先,为什么它会尾随))?要么他们不应该在那里,要么在其他地方有一些(


其次,EXCEPT的展示位置错误。

这个例子是......

SELECT sname FROM ... WHERE NOT EXISTS (...)
EXCEPT
SELECT bid   FROM ...

但看起来,由于某些原因,希望成为......

SELECT sname FROM ... WHERE NOT EXISTS (SELECT bid FROM ...
                                        EXCEPT
                                        SELECT bid FROM ...
                                       )

(它当前与主查询“不同”,而不是来自WHERE子句中的子查询。移动括号内的EXCEPT可以修复它。)


最后,即使修复了,它仍然无济于事。然后子查询将成为......

NOT EXISTS (SELECT bid FROM boats B
            EXCEPT
            SELECT bid FROM reservations R WHERE R.bid = B.bid AND R.sid = S.sid
           )

不幸的是,EXCEPT中的一个查询无法引用另一个查询。

R.sid = S.sid很好,因为这是一个内部查询引用和外部查询。 (那些被称为“相关”子查询 - 在某种意义上,整个相关子查询重复执行,外部查询中的每一行一次。)

但是R.bid = B.bid是“乱码”,因为reservations中的行完全独立于boats中的行进行处理。