我有三张表与软件开发公司的支持票据数据相关,表格的排列方式如下:
Tickets
[PK]
ID Ticket_Type Type Created Resolved
s-100 s Bug 1434725860524 1463075456304
d-29 d Deployment 1434724333500 1463665757667
p-50 p Upgrade 1434722686876 1466575675677
s-25 s Training Issue 1434723799989 1465675675677
P-ticket_links
[PK]
Pticket Link
p-50 s-100
p-50 s-102
p-50 d-29
D-ticket_servers
[PK]
ID Server
d-29 Live Server
d-30 Test Server
d-31 Live Server
底部两个表中的主键列也是引用ID
表的Tickets
列的外键。
对于p
'升级'的每张Type
票证,我需要找出在解决日期之后创建的已关联s
票证的数量链接的d
票证,其本身是Type
'部署',并且是针对Live Server执行的。
我已经编写了一个查询,以使用s
子句获取与每个升级p
票证关联的GROUP BY
票证总数:
SELECT *,count(ts.id)
from [P-ticket_links] ptls
inner join [Tickets] ts on ts.ID=ptls.Link
inner join [Tickets] ts2 on ts2.ID=ptls.Pticket
where ts.Ticket_Type='s'
and ts2.Type='Upgrade'
group by ptls.Pticket
我还可以使用类似的查询找到每个d
票证的Live Server部署p
票证的解决日期。但是,我遇到的麻烦就是将这两个结果合并在一起,以排除在Live Server部署s
票证的解决日期之前创建的d
票证。
我已经尝试创建Tickets
表的另一个别名,过滤它以包含相关的d-ticket,然后输入像WHERE tickets1.created > tickets3.resolved
这样的子句,但这并没有给我权利结果
我认为我需要做的就是返回一个表,其中每一行都包含一个链接到相应s
票证的p
票证以及{{1}的已解决日期票证链接到该d
票证。我可以更改我的数据库结构以在第一个实例中包含信息,但我不想再对我的数据库进行非规范化,我觉得我应该能够用SQL执行此操作。
有人能指出我如何实现这一目标吗?
答案 0 :(得分:1)
我已经弄清楚了。这是如何返回我想要的结果:
select *,count(*) from [p-ticket_links] ptls
inner join
(SELECT
ts2.id as 'p-id',
ts.resolved as 'd-resolved'
FROM [tickets] ts
inner join [p-ticket_links] ptl on [ptl].link=ts.id
inner join [d-ticket_servers] dts on dts.id=ts.id
inner join [tickets] ts2 on ptl.pticket=ts2.id
inner join [p-ticket_versions] ptvs on ptvs.id=ts2.id
where [ts].type='Deployment'
and dts.server='Live Server'
and ts.summary like '%upgrade%'
and ts2.project_type='Upgrade'
and ts.state <> 'Duplicate') dres on dres.[p-id]=ptls.pticket
inner join [tickets] ts on ts.id=ptls.link
inner join [tickets] ts2 on ts2.id=ptls.pticket
where ts.ticket_type='S'
and ts2.project_type='Upgrade'
and ts.created > dres.[d-resolved]
group by ptls.pticket