[英]Query for Many-To-One With AND
我有一個問題跟蹤網絡應用程序表,可以將問題映射到故障單號碼。 給定的問題可以(假設地)映射到它的無限數量的票證。 我想做一個SQL查詢,它會得到一個可能附加多個票證的問題。
例如:
issue_id | ticket_id
--------------------
1 | 100
1 | 101
2 | 101
(SQL小提琴: http ://sqlfiddle.com/#!2/b3c34/3)
(一點背景)我正在為這個網絡應用程序開發一個新的搜索頁面,其中一個可搜索字段是票號。 用戶可以指定要搜索的任意數量的票號。
因此,假設用戶正在嘗試查找已將票號100和101映射到它們的所有問題編號。 以下SQL查詢不返回任何行:
select issue_id
from tickets
where ticket_id = 100 and ticket_id = 101;
有人能指出我正確的方向嗎? 有沒有辦法用一個查詢有效地完成上述操作? 請注意,查詢中可能會返回數百個問題編號(故障單編號只是一個更大的查詢的一小部分),所以我希望這一點盡可能簡單。
謝謝。
select issue_id
from tickets
where ticket_id in (101,102)
group by issue_id
having count(distinct ticket_id) = 2
你的tickets
表應該是一個連接表 。 然而...
select distinct issue_id
from tickets t
where exists (select 1 from tickets where ticket_id = 100 and issue_id = t.issue_id)
and exists (select 1 from tickets where ticket_id = 101 and issue_id = t.issue_id);
要么:
select distinct issue_id
from tickets
where issue_id in (select issue_id from tickets where ticket_id = 100)
and issue_id in (select issue_id from tickets where ticket_id = 101);
會做你想要的。 后者通常更容易理解,但前者往往表現更好。
您也可以這樣做,但這是一個設置操作查詢,通常不鼓勵。 但是,SQLFiddle上的執行計划表明這是三者中最好的。
select issue_id from tickets where ticket_id = 100
intersect
select issue_id from tickets where ticket_id = 101;
還有至少一種方法可以做到這一點,自我INNER JOIN
。
另外一個選項:
select ticket100.issue_id
from (select issue_id from tickets where ticket_id = 100) as ticket100
inner join (select issue_id from tickets where ticket_id = 101) as ticket101
on ticket100.issue_id = ticket101.issue_id
不知道它在性能表上的位置,但這是我想到的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.