查询以显示哪些游戏,哪些朋友没有



我在Access中设置了三个表。我想做一个查询,显示与我没有共同点的游戏。

我试着使用一个不匹配的查询,但没有用,因为每个人都至少有一个游戏与我相同

我想我不确定该怎么处理。GameTimePlayed表基本上与我想要查询的信息相反,所以是否可以查询并在"GameName"或其他内容中添加"Not"条件?

这是课堂上的期末项目,大约还要一个月才能到期。我不希望有人替我回答这个问题,但即使只是一个正确的方向,我也会非常感激。到目前为止,我试图找到的所有东西基本上都是关于不匹配的查询,这对我来说不起作用


--编辑以提供更多信息--

我有FavoriteGames中的所有游戏。然而,并不是我所有的朋友(PersonID)都拥有我所有的FavoriteGames。我想要一个查询来显示FirstName、LastName、GameName的记录,对于每个PersonID,对于他/她没有的每个GameName。

预期行为示例:PersonID 10与我只有一个共同的GameName。该查询应返回PersonID 10的五条记录(除火箭联盟外的每场比赛)。

样本数据:

tbl_FavoriteGames

tbl_FriendsWithGame

tbl_GameTimePlayed

GameNametbl_FavoriteGames主键

PersonIDtbl_FriendsWithGame主键

PersonIDGameName外键组成tbl_GameTimePlayed组合主键

这是我迄今为止最接近的一次(尽管还有很长的路要走),因为它删除了指定的GameName:

SELECT *
FROM tbl_GameTimePlayed
WHERE NOT EXISTS
(
SELECT *
FROM tbl_FriendsWithGame
WHERE tbl_GameTimePlayed.PersonID = tbl_FriendsWithGame.PersonID
AND tbl_GameTimePlayed.GameName = tbl_FavoriteGames.GameName
);

它提示我输入一个游戏名称(不知道为什么)。当我输入一个GameName时,它会返回所有没有特定GameName的记录。

这将为每个人返回6个游戏,无论该人是否真的拥有该游戏。可能很有用,因为它包含了不常见的人/游戏。

SELECT PersonID, GameName
FROM tbl_FriendsWithGame, tbl_FavoriteGames
WHERE EXISTS (SELECT PersonID FROM tbl_GameTimePlayed WHERE GameName = tbl_GameTimePlayed.GameName);

我尝试了"WHERE NOT EXISTS",结果为0。


--第二版:已解决--

我今天重新审视了这个问题,并解决了它!我使用上面提到的代码查询(qry_AllPeopleAllGames)所有人的所有游戏列表(因此每人6个条目

SELECT PersonID, GameName
FROM tbl_FriendsWithGame, tbl_FavoriteGames
WHERE EXISTS (SELECT PersonID FROM tbl_GameTimePlayed WHERE GameName = tbl_GameTimePlayed.GameName);

然后,我做了另一个查询,将qry_AllPeopleAllGames列表与我的tbl_GameTimePlayed(即人员、他们实际拥有的游戏和玩的时间的列表)进行了比较,并吐出了FirstName&真实列表中不存在的LastInitial和GameName:

SELECT [tbl_FriendsWithGame]![FirstName] & " " & [tbl_FriendsWithGame]![LastInitial] AS FullName, GameName
FROM qry_AllPeopleAllGames INNER JOIN tbl_FriendsWithGame ON qry_AllPeopleAllGames.PersonID = tbl_FriendsWithGame.PersonID
WHERE ((NOT Exists (SELECT PersonID, GameName
FROM tbl_GameTimePlayed
WHERE qry_AllPeopleAllGames.PersonID = tbl_GameTimePlayed.PersonID AND qry_AllPeopleAllGames.GameName = tbl_GameTimePlayed.GameName
)));

****注意:***不需要SELECT的第一部分,我只是使用它来更容易地查看实际的查询结果(在一个字段中显示名字/姓氏首字母)。

我真的很兴奋我发现了这个!我相信有更好/更有效的方法可以做到这一点,如果你想分享,请告诉我!

我在最初的帖子中包含了这一点,但我也会把它作为答案发布。

我今天重新审视了这个问题,并解决了它!昨晚,在尝试测试随机可能的解决方案时,我意外地进行了一个查询,列出了所有人的所有游戏(因此每人有6个条目)。今天,我将其作为解决方案的一部分qry_AllPeopleAllGames:

SELECT PersonID, GameName
FROM tbl_FriendsWithGame, tbl_FavoriteGames
WHERE EXISTS (SELECT PersonID FROM tbl_GameTimePlayed WHERE GameName = tbl_GameTimePlayed.GameName);

然后,我进行了另一个查询,将qry_AllPeopleAllGames列表与我的tbl_GameTimePlayed进行了比较,后者是真实的人员/游戏/小时列表。

它返回FirstName&LastInitialGameName,用于出现在tbl_GameTimePlayed表中的每个PersonID/GameName组合。这是代码:

SELECT [tbl_FriendsWithGame]![FirstName] & " " & [tbl_FriendsWithGame]![LastInitial] AS FullName, GameName
FROM qry_AllPeopleAllGames INNER JOIN tbl_FriendsWithGame ON qry_AllPeopleAllGames.PersonID = tbl_FriendsWithGame.PersonID
WHERE ((NOT Exists (SELECT PersonID, GameName
FROM tbl_GameTimePlayed
WHERE qry_AllPeopleAllGames.PersonID = tbl_GameTimePlayed.PersonID AND qry_AllPeopleAllGames.GameName = tbl_GameTimePlayed.GameName
)));

注意:不需要SELECT的第一部分,我只是使用它来更容易地查看实际的查询结果(在一个字段中显示名字/姓氏首字母)。

我真的很兴奋我发现了这个!我相信有更好/更有效的方法可以做到这一点,如果你想分享,请告诉我

您需要一个包含所有可能的朋友/游戏对的数据集,以确定每个朋友没有哪些游戏。你有tbl_Friends吗?考虑:

查询1:
SELECT tblFriends.ID, tbl_FavoriteGames.ID FROM tblFriends, tbl_FavoriteGames;

这是一个笛卡尔查询——如果没有JOIN子句,每个表的每个记录都将与另一个表的每条记录相关联。

查询2:
SELECT Query1.tblFriends.ID, Query1.tbl_FavoriteGames.ID FROM tbl_FriendsWithGame RIGHT JOIN Query1 ON (tbl_FriendsWithGame.GameID = Query1.tbl_FavoriteGames.ID) AND (tbl_FriendsWithGame.FriendID = Query1.tblFriends.ID) WHERE tbl_FriendsWithGame.GameID IS NULL;

或者,如果您没有tbl_Friends
SELECT DISTINCT tbl_FriendsWithGame.FriendID, tbl_FavoriteGames.ID FROM tbl_FavoriteGames, tbl_FriendsWithGame;

然后调整Query2。

最新更新