1

表A:

dvdID.......dvd 标题

d01…………复仇者

d02.............复仇者

d03........蜘蛛侠

表 B:

租借ID.......dvdID

r01…………d01

r02…………d02

r03…………d03

表 C:

returnID.......rentID

t01................r01

我想选择不在表 B(租用)中的 dvd,但在表 C(返回)中除外,所以输出应该是这样的:

输出:

dvdID.......dvd 标题

d01…………复仇者

你可以帮帮我吗?

4

6 回答 6

3

您可以在 SQL 条件中使用存在量词,由EXISTS关键字表示:

SELECT *
FROM TableA a
WHERE NOT EXISTS (        -- No rental record
    SELECT *
    FROM TableB b
    WHERE b.dvdID=a.dvdID -- The record is for this DVD, and...
      AND NOT EXISTS (    -- ...there is no return record
          SELECT * FROM TableC c WHERE c.rentID=b.rentID
      )
)

该查询读起来几乎就像一个结构不佳的英语句子,但它解释了正在发生的事情。

于 2014-04-08T13:58:09.700 回答
1

从您的示例数据集中很明显,您需要其租金存在于 TableC 中的 dvd,为此您可以这样做一个简单的INNER连接,来自 table3 的最后一个连接将满足来自 table1 的 dvd 的租金存在条件

select t1.* FROM
Table1 t1
LEFT JOIN Table2 USING(dvdID)
JOIN Table3 USING(rentID)

小提琴演示

于 2014-04-08T14:04:40.217 回答
1

试试这个选项 1

select * from A 
where dvdID not in (Select dvdID from B where rentID not in (select rentID from C))
于 2014-04-08T14:13:19.293 回答
1

尝试这个,

SELECT *
FROM A 
WHERE (NOT EXISTS (SELECT * FROM B WHERE B.dvdID=A.dvdID))
   OR (EXISTS (SELECT * FROM C,B WHERE C.rentID=B.rentID and B.dvdID=A.dvdID))

这是SQLFiddle

于 2014-04-08T14:03:19.067 回答
0

你应该使用JOINS而不是EXISTS / NOT EXISTS

SELECT 
    a.*
FROM TableA a
    LEFT join TableB b
        on b.id=a.id
    LEFT Join TableC c 
        on c.id=a.id
WHERE
    b.id is null 
    OR (b.id is not null AND c.id is not null)
于 2014-04-08T14:25:10.850 回答
0

尝试这个:

SELECT TableA.dvdID, TableA.dvdTitle 
FROM TableA
LEFT JOIN TableB ON TableA.dvdID = TableB.dvdID
LEFT JOIN TableC ON TableC.rentID = TableB.rentID
WHERE TableB.rentID IS NULL
   OR (TableB.rentID IS NOT NULL
       AND TableC.returnID IS NOT NULL)
于 2014-04-08T14:13:05.127 回答