查询以显示哪些朋友没有

时间:2017-11-17 22:15:29

标签: database ms-access

我在Access中设置了three tables。我想提出一个查询,显示哪些人与我没有共同点

我尝试使用不匹配的查询,但由于每个人至少有一个与我共同的游戏,因此无法运作。

我想我不确定如何处理这个问题。 GameTimePlayed表基本上与我想要查询的信息相反,因此可以查询并添加" Not"条件为" GameName"还是什么?

这是针对课程的最终项目,并且还有一个月未到期。我不希望任何人为我回答这个问题,但即使是朝着正确方向的一点,也会非常感激。到目前为止,我试图找到的所有内容基本上都是关于无法比拟的查询,这对我来说无效。

- 编辑以提供更多信息 -

我在FavoriteGames中拥有所有游戏。但是,并非所有的朋友(PersonID)都拥有我喜欢的所有游戏。我想要一个查询,为每个PersonID显示他/她没有的每个GameName的FirstName,LastName,GameName记录。

  

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

示例数据:

tbl_FavoriteGames

tbl_FriendsWithGame

tbl_GameTimePlayed

GameName tbl_FavoriteGames 主键

PersonID tbl_FriendsWithGame 主键

GameName 外键形成 tbl_GameTimePlayed <的复合主键 / EM>

这是我到目前为止最接近的(尽管如此)它删除了指定的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;什么不存在&#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&amp;列表。 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的第一部分,我只是用它来查看我的实际查询结果(在一个字段中显示名字/最后一个首字母)。

我很高兴我明白这一点!我确定有更好/更有效的方法来做到这一点,如果你想分享,请告诉我!

2 个答案:

答案 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&amp; 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。