2012-05-27 63 views
1

我目前正在研究一個涉及多對多和一對多關係的非常大的項目...有幾個表格可以使用,我無法弄清楚做我想做的事。 這是我的第一表(對象表):SQL查詢中複雜的條件

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

我正在嘗試查找用戶具有的對象表中的所有對象。用戶需要擁有所有的對象名稱。並且對於每個名稱,用戶的值必須至少爲該名稱的對象的值。

例如,此處用戶的Aaaa值爲10,Bbbb值爲7.因此,他具有對象1的所有名稱,且其值大於或等於這些值。 因此,他可以有對象n°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 | 
+---------+-----------+------+ 

的問題是,我想擺脫這是因爲用戶沒有e對象2的Aaaa的餘地。

任何幫助將不勝感激! 感謝

回答

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

我真正想要的是,如果一個對象具有比用戶更高的價值,那麼所有使用相同的對象ID(但不同的名稱)不包括在內。在我的示例中,由於用戶沒有足夠的Aaaa來處理對象2,因此應該排除ID爲2的任何內容。所以7,2; Bbbb不應該顯示。我不完全確定這項工作。讓我看看。 感謝您的回覆。 – califrench

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 ONü加入 對象O. 。 name = o.name 其中u.value> = o。值

您可以通過具有插入之前以下行創建表:

insert into UserObjects(UserId, ObjectId, Name, Value) 
+0

我認爲你不明白我的目標。我的目標是填充表示用戶和對象之間關係的表格。該表將是另外兩個表上查詢的結果。 – califrench

+0

嘿傢伙!我終於找到了解決方案,我希望沒有缺陷或重大缺點。 這裏是我如何做到這一點: 'SELECT對象ID,用戶ID 來自用戶的 RIGHT JOIN對象 ON Users.Name = Objects.Name和Users.Value> = Objects.Value GROUP BY對象ID HAVING COUNT(對象.Name)= COUNT(Users.Name)' 儘管感謝您的幫助! – califrench