使用AND查询多对一

时间:2014-04-22 17:33:39

标签: sql sql-server

我有一个问题跟踪网络应用程序表,可以将问题映射到故障单号码。给定的问题可以(假设地)映射到它的无限数量的票证。我想做一个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;

有人能指出我正确的方向吗?有没有办法用一个查询有效地完成上述操作?请注意,查询中可能会返回数百个问题编号(故障单编号只是一个更大的查询的一小部分),所以我希望这一点尽可能简单。

感谢。

3 个答案:

答案 0 :(得分:1)

select issue_id 
from tickets
where ticket_id in (101,102)
group by issue_id
having count(distinct ticket_id) = 2

答案 1 :(得分:1)

您的tickets表大概应该是Junction Table。然而...

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

答案 2 :(得分:0)

另一种选择:

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

不知道这取决于性能表,但这是我想到的。