按联接筛选 SQL

加拿大皇家银行凯尔布拉德

我正在编写我的第一个 SQL 查询,所以请原谅我对此事缺乏了解。

我希望从每个连接中过滤多次,并且执行的查询总行数似乎在增长,而不是在缩小。

/*  

Reads Order Status, determines if it's OPEN
Pulls all OPEN orders to Time Tickets
Reads the Time Ticket TicketDate, determines if it's > 90 days old
Compares PODet JobNo, joins PO table
Reads the PO DateMod, determines if it's > 90 days old

*/


DECLARE @now DATETIME
DECLARE @90daysago DATETIME


SET @now = GETDATE()
SET @90daysago = DATEADD(day, -90, @now)

SELECT
    o.JobNo,
    o.OrderNo,
    o.PartNo,
    o.Status,
    o.JobNo,
    t.TicketDate,
    p.Status,
    p.OutSideService,
    p.PONum,
    po.DateEnt,
    po.DateMod


FROM
    RBCBEMD.dbo.OrderDet AS o       /* OrderDet = o */

INNER JOIN RBCBEMD.dbo.TimeTicketDet AS t       /* TimeTicket = t */
    ON o.JobNo = t.JobNo

INNER JOIN RBCBEMD.dbo.PODet AS p           /* PODet = p */
    ON o.JobNo = p.JobNo

INNER JOIN RBCBEMD.dbo.PO AS po         /* PO = po */
    ON p.PONum = po.PONum

WHERE 
    o.Status = 'Open' AND
    t.TicketDate <= @90daysago AND
    po.DateMod <= @90daysago

ORDER BY
    cast(t.TicketDate as DATETIME) DESC

该查询应该从 OrderDet 表中查找 OPEN 订单。从那里,如果它是 OPEN,则从 TimeTicketDet 表中提取最后一个 TicketDate。确定 TicketDate 是否大于 90 天。如果超过 90 天,则从 PO 表中提取 PONum,找到它的 DateMod 并确定它是否超过 90 天。

如果 (o.status ='Open') AND (t.ticketDate >90 days old) AND (po.DateMod >90 days old) 然后发布 JobNo 的结果。

阿南德

哦,我在第二次阅读您的需求后看到了问题。您只想从 TimeTicketDet 表中提取最后一个票证日期。您需要一个简单的不存在来删除重复的行:

DECLARE @now DATETIME
DECLARE @90daysago DATETIME

SET @now = GETDATE()
SET @90daysago = DATEADD(day, -90, @now)

SELECT
    o.JobNo,
    o.OrderNo,
    o.PartNo,
    o.Status,
    o.JobNo,
    t.TicketDate,
    p.Status,
    p.OutSideService,
    p.PONum,
    po.DateEnt,
    po.DateMod


FROM
    RBCBEMD.dbo.OrderDet AS o       /* OrderDet = o */

INNER JOIN RBCBEMD.dbo.TimeTicketDet AS t       /* TimeTicket = t */
    ON o.JobNo = t.JobNo

INNER JOIN RBCBEMD.dbo.PODet AS p           /* PODet = p */
    ON o.JobNo = p.JobNo

INNER JOIN RBCBEMD.dbo.PO AS po         /* PO = po */
    ON p.PONum = po.PONum

WHERE 
    o.Status = 'Open' AND
    t.TicketDate <= @90daysago AND
    po.DateMod <= @90daysago
and not exists (
    select 1
    from RBCBEMD.dbo.TimeTicketDet as t2
    where t2.JobNo = o.JobNo
    and t2.TicketDate > t.TicketDate
    )

ORDER BY
    cast(t.TicketDate as DATETIME) DESC

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章