从Access中的另一个表中减去表

时间:2018-11-15 10:05:02

标签: sql ms-access

我有3个表-UsersImagesUsers_Images。 每个用户可以购买许多图像,并且每个图像可以由多个用户购买。 表中的字段如下:

Users - Id, UserName, Password

Images - Id, Name, Description, Path

Users_Images - UserId, ImageId, PurchaseDate。 (表之间的所有关系都已设置) 我正在尝试建立一个查询,该查询将选择一个表,其中包含特定用户尚未购买的所有图像 我的算法是选择一张包含所有已购买特定用户的图像的表,然后从整个图像表中减去该表。 但是,无论我如何尝试将其写为查询,它总是给我错误或不完整的结果。 我尝试过的一些查询:

SELECT Id, [Name], Description, Path 
FROM Images
EXCEPT
SELECT Id, [Name], Description, Path 
FROM Images AS I INNER JOIN Users_Images AS UI
ON I.Id = UI.ImageId
WHERE UserId = 1

OR

SELECT Id, [Name], Description, Path 
FROM Images
WHERE NOT EXISTS (
SELECT Id, [Name], Description, Path 
FROM Images AS I INNER JOIN Users_Images AS UI
ON I.Id = UI.ImageId
WHERE UserId = 1)

我也在这里和其他网站上搜索解决方案,但是没有一个起作用。

3 个答案:

答案 0 :(得分:0)

使用not in

select im.Name,im.Description,im.Path from Images im where im.id not in (

select i.id Users_Images ui join Images i on ui.ImageId=i.id
join Users u on ui.UserId=u.Id
where u.UserId=1
)

答案 1 :(得分:0)

您的第二个版本需要关联:

SELECT im.*
FROM Images im
WHERE NOT EXISTS (SELECT 1
                  FROM Images AS I INNER JOIN 
                       Users_Images AS UI
                       ON I.Id = UI.ImageId
                  WHERE UI.UserId = 1 AND I.Id = im.Id
                 ); 

答案 2 :(得分:0)

这对您有用吗?

SELECT Id, [Name], Description, Path 
FROM Images as I
WHERE NOT EXISTS (SELECT 1
                  FROM Users_Images AS UI
                  WHERE UI.ImageId = I.Id AND
                        UI.UserId = 1
                 );

这只是返回用户ID为1的user_images中没有行的所有图像。