我有這些表:
專案
| ID | 姓名 | 版本 |
|---|---|---|
| 1 | 皮特 | 0.0.1 |
| 2 | 贓物 | 0.0.1 |
| 3 | 贓物 | 0.0.2 |
| 4 | 贓物 | 0.0.3 |
| 5 | 羽衣甘藍 | 0.0.1 |
| 6 | 羽衣甘藍 | 0.0.2 |
人
| ID | 姓名 |
|---|---|
| 1 | 杰克 |
| 2 | 斯凱 |
| 3 | 基思 |
| 4 | 吉姆 |
| 5 | 伊莉茲 |
個人_專案
| ID | person_id | 專案編號 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
| 4 | 3 | 1 |
| 5 | 3 | 3 |
| 6 | 4 | 1 |
| 7 | 4 | 4 |
| 8 | 5 | 1 |
| 9 | 5 | 2 |
| 10 | 5 | 5 |
每個人都有獨特的專案,這意味著沒有兩個人會在同一個專案上作業。
我正在撰寫一個基于 java 的 api,我在其中收到不同專案的 json 請求,我必須回傳正在處理請求中給出的確切專案的人。
要求:
[
{"name": "Pete", "version": "0.0.1"}
]
這應該回傳Jake
要求:
[
{"name": "Pete", "version": "0.0.1"},
{"name": "Swag", "version": "0.0.1"}
]
這應該回傳Skye
要求:
[
{"name": "Pete", "version": "0.0.1"},
{"name": "Swag", "version": "0.0.2"}
]
這應該回傳Kieth
我正在為此撰寫 SQL,但沒有得到我需要的東西。
這就是我要做的
SELECT pe.id, pe.name
FROM person pe
LEFT JOIN person_project pepr on pepr.person_id = pe.id
WHERE pe.id IN (
SELECT pepr.person_id
FROM project pr
LEFT JOIN person_project pepr ON pepr.project_id = pr.id
WHERE pr.name IN ('Pete', 'Swag') AND pr.version IN ('0.0.1', '0.0.2')
GROUP BY pepr.project_id
HAVING COUNT(pepr.project_id) = 2
)
GROUP BY pe.id, pe.name
HAVING COUNT(pe.id) = 2
這是不對的,因為我將 IN 用于將應用于其他專案的版本。
uj5u.com熱心網友回復:
您可以使用此答案中描述的 SQL 關系除法邏輯。您對表示精確除法/無余數的部分感興趣:
with project_list as (
select id
from project
where exists (
select *
from (values
('pete', '0.0.1'),
('swag', '0.0.1')
) as user_input(name, version)
where project.name = user_input.name and project.version = user_input.version
)
), person_project_copy as (
select person_id, case when project_list.id is not null then 1 end as is_required
from person_project
left join project_list on person_project.project_id = project_list.id
)
select person_id
from person_project_copy
group by person_id
having count(is_required) = (select count(*) from project_list)
and count(*) = (select count(*) from project_list)
所有三個示例的 DB<>Fiddle
uj5u.com熱心網友回復:
這是一個經典的無余數關系除法問題。
首先將輸入資料放入表變數或表值引數或臨時表中。
然后您可以使用標準的關系除法答案之一
SELECT
p.name
FROM Person p
WHERE EXISTS (SELECT 1
FROM Person_Project pp
LEFT JOIN @input i
JOIN Project prj ON prj.name = i.name AND prj.version = i.version
ON pp.project_id = prj.id
WHERE pp.person_id = p.id
HAVING COUNT(prj.id) = COUNT(*)
AND COUNT(prj.id) = (SELECT COUNT(*) FROM @input)
);
db<>小提琴
它的作用如下:
- 獲取以下子查詢為真的所有
Person行:EXISTS - 對于每個人來說,
Person他們所有的Person_Project行 - 左連接輸入資料(同時加入匹配
Project)。 - 將其分組并確保來自連接的匹配數等于子查詢中的行數......
- ...并且數量也等于輸入行的總數。
對此也有其他解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481350.html
