簡體   English   中英

使用AND查詢多對一

[英]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.

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