Sql 使用和查询多对一
我有一个问题跟踪web应用程序表,该程序将问题映射到票号。一个给定的问题(假设)可以有无限数量的票证映射到它。我想执行一个SQL查询,该查询将得到一个可能附加了多个票证的问题 例如:Sql 使用和查询多对一,sql,sql-server,Sql,Sql Server,我有一个问题跟踪web应用程序表,该程序将问题映射到票号。一个给定的问题(假设)可以有无限数量的票证映射到它。我想执行一个SQL查询,该查询将得到一个可能附加了多个票证的问题 例如: issue_id | ticket_id -------------------- 1 | 100 1 | 101 2 | 101 (SQL FIDLE:) (一点背景知识)我正在为这个web应用开发一个新的搜索页面,其中一个可搜索的字段是票号。用户可以指定要
issue_id | ticket_id
--------------------
1 | 100
1 | 101
2 | 101
(SQL FIDLE:)
(一点背景知识)我正在为这个web应用开发一个新的搜索页面,其中一个可搜索的字段是票号。用户可以指定要搜索的任意数量的票证号码
假设一个用户试图找到所有的问题编号,这些编号对应着票号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
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);
或:
我会照你说的做。后者往往更容易理解,但前者往往表现得更好
您也可以这样做,但这是一个集合操作查询,通常不鼓励这样做。然而,SQLFiddle上的执行计划表明这是三者中最好的
select issue_id from tickets where ticket_id = 100
intersect
select issue_id from tickets where ticket_id = 101;
至少还有另外一种方法可以做到这一点,使用self内部连接
另一个选项:
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
性能表上不知道这在哪里,但我想到了这一点。此查询将获得附有多张票证的问题ID,但是我想做的是——对于一个给定的可能的票号列表——得到所有这些票号都附在一起的问题。我的第一个问题不是特别清楚我想查询什么(或什么)。我已经更新了一些关于用例的背景知识。太棒了,这些都是完美的。
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