1

私は現在、多対多および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   |
+-----------+------+-------+

私の2番目のテーブルは次のとおりです(ユーザーテーブル):

+---------+------+-------+
| 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   |
+---------+------+-------+

他のテーブル間の関係を示す3番目のテーブルがあります

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

ユーザーが持っているオブジェクトテーブル内のすべてのオブジェクトを見つけようとしています。ユーザーはすべてのオブジェクト名を持っている必要があります。また、名前ごとに、ユーザーの値は少なくともその名前のオブジェクトの値である必要があります。

たとえば、ここでは、ユーザーは値10のAaaaと値7のBbbbを持っています。したがって、ユーザーはオブジェクト1のすべての名前を持っており、彼の値はそれらの値以上です。したがって、彼はオブジェクト番号1を持つことができます。オブジェクト2の場合、ユーザーはAaaaを十分に持っていないため、オブジェクト2を持つことはできません。

ユーザーが名前を持ち、内部結合で十分な値を持つオブジェクトテーブルのすべての行を取得する方法を知っています:

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 |
+---------+-----------+------+

問題は、ユーザーがオブジェクト2に十分なAaaaを持っていないため、ここで最後の行を削除したいということです。

どんな助けでも大歓迎です!ありがとう

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)ユーザーオブジェクトテーブルは必要ありません。これらのテーブルのより良いデータベース構造を考え出すことができるかどうかを確認するために、別の質問をすることをお勧めします。

目標がユーザーオブジェクトテーブルにデータを入力することである場合、クエリはさらに簡単になります。

ユーザーからu.userid、o.objectid、o.nameを選択しますuはu.name=o.nameのオブジェクトoに参加しますここでu.value>=o.value

挿入の前に次の行を含めることで、テーブルを作成できます。

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