簡體   English   中英

具有1:n關系的SQL查詢,查找具有兩個匹配子對象的所有實體

[英]SQL query with 1:n relation, find all entities which have two matching children matching

我有一個簡單的父子關系(1:n,@ OneToMany),由JPA映射。

一個孩子(除其他外)具有以下屬性:

  • 用戶
  • 類型

我現在要查找所有父元素,它們至少具有以下兩個子元素:

  • 用戶='user1'且類型='type1'的第一個孩子且
  • 第二個用戶為user ='user2'且類型=='type2'的孩子或
  • 用戶='user1'且類型='type2'的第一個孩子且
  • 用戶='user2'並且類型='type1'的第二個孩子

例如,一個實體可以有10個孩子,但是其中兩個必須符合上述條件。

您是否有任何使用SQL / JPA Criteria API進行處理的提示?

是EXISTS子句走的路,是這樣的:

SELECT * FROM Parent parent
WHERE EXISTS (SELECT child FROM Child WHERE (child.user = 'user1' AND    child.type = 'type1' OR ...) AND child.id=parent.id)
OR
EXISTS (SELECT child FROM Child WHERE (child.user = 'user1' AND child.type = 'type2' OR ...) AND child.id=parent.id)

謝謝你的幫助!

更新:父級代表“郵件”,子級關系代表郵件的發送者和接收者,如下所示:

Parent Table (Mail):
|id | subject     |
|1  | Hello World |
|2  | Foo Bar     |
|3  | Example     |
|4  | Test        |

Child Table:
|id | user      | type     |
|1  | user1@mail| SENDER   |
|1  | user2@mail| RECEIVER |
|1  | user3@mail| RECEIVER |
|2  | user1@mail| SENDER   |
|2  | user4@mail| RECEIVER |
|2  | user5@mail| RECEIVER |
|3  | user2@mail| SENDER   |
|3  | user1@mail| RECEIVER |
|3  | user5@mail| RECEIVER |
|4  | user3@mail| SENDER   |
|4  | user1@mail| RECEIVER |
|4  | user2@mail| RECEIVER |

子表的主鍵是(id,user,type)的組合鍵。 id列是1:n關系的連接列。

我想查找所有由user1發送並由user2接收的郵件,反之亦然,例如,兩個用戶之間交換的郵件。

輸入示例:'user1','user2'結果:郵件1和3,但不包含郵件4,因為在郵件4中,兩個用戶都是接收者。

一個巧妙的技巧是計算這樣的父母擁有的唯一孩子的數量:

SELECT * 
FROM   parent p
WHERE  EXISTS (SELECT   child_id
               FROM     child c
               WHERE    user IN ('user1', 'user2') AND
                        type IN ('type1', 'type2') AND
                        c.parent_id = p.id
               GROUP BY child_id
               HAVING   COUNT(DISTINCT user) = 2 AND
                        COUNT(DISTINCT type) = 2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM