我需要返回广告表中不在TVRadio表中的所有adID

时间:2019-02-20 10:27:55

标签: sql

我想返回adRadi不在TVRadio电台中的记录,仅意味着Web和Magazine。对于上下文,这是我的- ER图

这是我到目前为止的查询

SELECT Employees.employeeID, Employees.firstName, Employees.lastName, CampaignEmployees.campaignID
FROM Employees
LEFT JOIN CampaignEmployees
ON Employees.employeeID = CampaignEmployees.employeeID
LEFT JOIN Adverts
ON CampaignEmployees.campaignID = Adverts.campaignID
LEFT JOIN TVRadio
ON Adverts.adID = TVRadio.adID

这将返回我需要的所有未过滤数据,我的问题是我似乎无法使条件正常工作。我尝试过WHERE NOT EXISTS( SELECT TVRadio.adID FROM TVRadio WHERE TVRadio.adID = Adverts.adID);,但它什么也没返回。

广告和TVRadio表格-图片

2 个答案:

答案 0 :(得分:0)

由于您正在LEFTAdverts之间进行TVRadio连接,因此需要添加:

WHERE TVRadio.adID IS NULL

如果TVRadio.adID IS NULL表示Adverts.adID没有匹配的TVRadio.adID 编辑
Adverts中有一个严重的问题。
您为列campaignID分配了错误的值(我认为它们是clientID的值):

CREATE TABLE Adverts (
adID INT(5),
campaignID INT(3),
clientID INT(3),
releaseDate DATE,
PRIMARY KEY (adID)
);

INSERT INTO Adverts 
VALUES (58224,25079332,1,'2019-08-12'),
(99534,63531211,91,'2019-04-20'),
(55755,15592835,16,'2019-09-08'),
(73418,99403438,77,'2019-05-30'),
(13463,79926376,34,'2019-06-26'),
(65660,47294923,1,'2019-07-19'),
(86926,43530233,91,'2019-10-10'),
(39925,14570146,16,'2019-12-15'),
(63452,90400859,77,'2019-02-28'),
(10124,63547321,34,'2019-08-24'),
(45537,25079332,1,'2019-03-11'),
(16232,15592835,91,'2019-04-30'),
(53040,79926376,16,'2019-01-02'),
(46791,43530233,77,'2019-09-24'),
(91974,90400859,34,'2019-04-16');

一种解决方法是重新排列列,如下所示:

CREATE TABLE Adverts (
adID INT(5),
clientID INT(3),
campaignID INT(3),
releaseDate DATE,
PRIMARY KEY (adID)
);

答案 1 :(得分:0)

当您插入数据时,广告系列中的campaignID与广告中的CampaignID不匹配。您的广告系列中的CampaignID为1,91,16,77,34您的广告中的CampaignID为25079332,63531211,15592835,99403438等,您似乎在“广告”表中以错误的顺序插入了数据。

更正数据后,此查询(您几乎可以使用它)将起作用。

SELECT Employees.employeeID, Employees.firstName, Employees.lastName, CampaignEmployees.campaignID
FROM Employees
JOIN CampaignEmployees ON Employees.employeeID = 
CampaignEmployees.employeeID
LEFT JOIN Adverts ON CampaignEmployees.campaignID = Adverts.campaignID
LEFT JOIN TVRadio ON Adverts.adID = TVRadio.adID
WHERE TVRadio.adID IS NULL