2017-04-21 86 views
0

我在寫我的第一個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天大)AND(po.DateMod> 90天大)然後發佈JobNo的結果。

+0

我找不到任何錯誤的查詢從快速掃描。它正在做你正在尋找的東西。現在,由於越來越多的門票將超過90天,我希望每次運行它時結果都會增長。你在結果中列出了''''t.ticketDate和po.DateMod''',爲什麼不檢查它們是否每個都超過90天?一個具體的問題對我們幫助你是有幫助的。 – Anand

回答

0

哦,我看這個問題閱讀您的需要進行第二次之後。您只想從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 
+0

阿南德 - 我真的很感激。這似乎有竅門,我會做一些研究,找出不存在的條款。我現在看到我有很多專欄的副本,有什麼方法可以補救嗎?我在線查看了SELECT DISTINCT,但它在我的查詢中引發了一個錯誤。 –

+0

是的,我懷疑你還有重複。不要在這裏使用DISTINCT子句。我懷疑發生的情況是您在此處加入了PODet表,並且我懷疑這表示採購訂單詳細信息,在這種情況下,該採購單中的每個行項目都會重複該工單。如果您想要的只是JobNo,請從選擇列表中刪除該表格和任何相應的列。 – Anand

+0

如果您需要該表將作業連接到採購訂單,則可以使用DISTINCT,但從選擇列表中刪除可能使該行不同的任何列。 – Anand

0

讓我首先回答您的問題:您的表具有一對多或多對多的關係,這會導致重複的行返回。您需要創建表格來排序多對多連接,或者在您的where語句中應用更強大的篩選器以擺脫它們。

如果你看看你的結果,你會看到重複鍵,大概是這樣的:

O.Jobno | P.Status 1 |打開 1 |關閉

請注意您的第一張表(O.Jobno)中的主鍵將如何多次出現。

這裏有一個很好的職位,讓你在正確的方向前進: Resolve many to many relationship