1

我目前正在从事一个涉及多对多和一对多关系的非常大的项目......有几张桌子可以使用,我不知道如何做我想做的事。这是我的第一个表(对象表):

+-----------+------+-------+
| Object ID | Name | Value |
+-----------+------+-------+   The Object ID is a foreign Key to another table.
|     1     | Aaaa |   2   |   The Name is unique for each Object ID.
|     1     | Bbbb |   5   |
|     2     | Aaaa |   15  |
|     2     | Bbbb |   3   |
+-----------+------+-------+

我的第二个表如下(用户表):

+---------+------+-------+
| User ID | Name | Value |
+---------+------+-------+    The User ID is also a foreign Key, there are  
|    7    | Aaaa |  10   |    multiple rows with the same User ID. 
|    7    | Bbbb |   7   |
+---------+------+-------+

我有第三张表显示其他表之间的关系

+---------+-----------+
| User ID | Object ID |
+---------+-----------+ There are no identical rows in this table. 
|    7    |     1     |
+---------+-----------+

我正在尝试查找用户拥有的对象表中的所有对象。用户需要拥有所有对象名称。对于每个名称,用户的值必须至少是该名称的对象的值。

例如这里,用户拥有值为 10 的 Aaaa 和值为 7 的 Bbbb。所以他拥有对象 1 的所有名称,并且他的值大于或等于这些值。因此他可以拥有对象 n° 1。对于对象 2,用户没有足够的 Aaaa,因此他不能拥有对象 2。

我知道如何使用 Inner Joins 获取用户具有名称和足够大值的对象表的所有行:

SELECT Users.User ID, Objects.Object, Objects.Name ID FROM Objects
INNER JOIN Users
ON Objects.Name = Users.Name AND Objects.Value <= Users.Value

但问题是它会返回以下内容:

+---------+-----------+------+
| User ID | Object ID | Name |
+---------+-----------+------+
|    7    |     1     | Aaaa |
|    7    |     1     | Bbbb |
|    7    |     2     | Bbbb |
+---------+-----------+------+

问题是我想去掉这里的最后一行,因为用户没有足够的 Aaaa 用于对象 2。

任何帮助将不胜感激 !谢谢

4

2 回答 2

1

您可以使用一个not exists子句来要求没有一个匹配对象的值高于用户的值:

select  Users.User ID, Objects.Object, Objects.Name ID 
from    Objects o
join    Users u
on      o.Name = u.Name 
where   not exists
        (
        select  *
        from    Objects o2
        where   o2.Name = u.Name
                and o2.Value > u.Value
        )
于 2012-05-27T11:12:50.800 回答
0

您的描述有点混乱,因为用户和对象的“名称”相同。我假设用户名与对象名不同,并且您要使用映射表。

您应该能够通过加入来做到这一点:

select u.userid, o.objectid, o.name
from UserObjects uo join
     Users u
     on uo.userid = u.userid join
     Objects o
     on uo.objectid = o.objectid
where u.value >= o.value

如果对象表和用户表中的名称确实相同,那么 (1) 你有一个非规范化的数据库结构和 (2) 你不需要用户对象表。您可能想问另一个问题,看看我们是否可以为这些表提供更好的数据库结构。

如果您的目标是填充用户对象表,那么查询就更简单了:

select u.userid, o.objectid, o.name from Users u join Objects o on u.name= o.name where u.value >= o.value

您可以通过在插入前添加以下行来创建表:

insert into UserObjects(UserId, ObjectId, Name, Value)
于 2012-05-27T13:14:04.270 回答