我在Access中设置了three tables。我想提出一个查询,显示哪些人与我没有共同点。
我尝试使用不匹配的查询,但由于每个人至少有一个与我共同的游戏,因此无法运作。
我想我不确定如何处理这个问题。 GameTimePlayed表基本上与我想要查询的信息相反,因此可以查询并添加" Not"条件为" GameName"还是什么?
这是针对课程的最终项目,并且还有一个月未到期。我不希望任何人为我回答这个问题,但即使是朝着正确方向的一点,也会非常感激。到目前为止,我试图找到的所有内容基本上都是关于无法比拟的查询,这对我来说无效。
- 编辑以提供更多信息 -
我在FavoriteGames中拥有所有游戏。但是,并非所有的朋友(PersonID)都拥有我喜欢的所有游戏。我想要一个查询,为每个PersonID显示他/她没有的每个GameName的FirstName,LastName,GameName记录。
预期行为示例: PersonID 10只有一个与我共同的GameName。该查询应返回PersonID 10的五个记录 (每场比赛除了火箭联赛)。
示例数据:
GameName 是 tbl_FavoriteGames 的主键
PersonID 是 tbl_FriendsWithGame 的主键
这是我到目前为止最接近的(尽管如此)它删除了指定的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时,它会返回所有不具有该特定GameName的记录。
每个人返回6个游戏,无论该人是否真的拥有该游戏。可能很有用,因为它包含了不同的人/游戏。
SELECT PersonID, GameName
FROM tbl_FriendsWithGame, tbl_FavoriteGames
WHERE EXISTS (SELECT PersonID FROM tbl_GameTimePlayed WHERE GameName = tbl_GameTimePlayed.GameName);
我试过了#34;什么不存在"并且返回了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的第一部分,我只是用它来查看我的实际查询结果(在一个字段中显示名字/最后一个首字母)。
我很高兴我明白这一点!我确定有更好/更有效的方法来做到这一点,如果你想分享,请告诉我!
答案 0 :(得分:1)
我在最初的帖子中包含了这个,但我也会将其作为答案发布。
我今天重新审视了这个问题,并想出来了!昨晚在尝试测试随机可能的解决方案时,我意外地为所有人做了一个列出所有游戏的查询(所以每人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 进行了比较,这是人/游戏/小时数的真实列表。
它会为 tbl_GameTimePlayed中不的每个PersonID / GameName组合返回 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的第一部分,我只是用它来查看我的实际查询结果(在一个字段中显示名字/最后一个首字母)。
我很高兴我明白这一点!我确信有更好/更有效的方法来做到这一点,如果你想分享,请告诉我!
答案 1 :(得分:0)
您需要一个所有可能的朋友/游戏对的数据集,以确定每个朋友没有的游戏。你有tbl_Friends吗?考虑:
查询1:
SELECT tblFriends.ID, tbl_FavoriteGames.ID FROM tblFriends, tbl_FavoriteGames;
这是一个笛卡尔式查询 - 没有JOIN子句,每个表的每个记录都会与其他表的每个记录相关联。
QUERY2:
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。