2012-09-18 191 views
3

我有一個select語句,並且只有當其中至少有一個與今天有60天不同的日期時才返回所有值。 問題是我有一個外部應用程序,它返回我想要比較的列,它們來自不同的表(一個屬於現金項目,另一個屬於卡項目)。
考慮到我有以下幾點:僅當至少有一行匹配時才選擇條件

OUTER APPLY (
    SELECT COUNT(*) AS quantity, MIN(date) AS item_date 
     FROM dbo.get_cash_items(loans.id_cash) AS cash_item 
     HAVING loans.id_product_type = 1 --Cash 
    UNION 
    SELECT COUNT(*) AS quantity, MIN(date) AS item_date 
     FROM dbo.get_card_items(loans.id_card) AS card_item 
     HAVING loans.id_product_type = 2 --Card 
) AS items 

我想返回所有的行,只有當DATEDIFF(DAY, MIN(items.item_date), GETDATE()) >= 60,但我想他們都哪怕只有一個匹配這個條件。
這樣做的最佳方法是什麼?

編輯
使其更清晰,我將解釋使用案例:
我需要顯示每一筆貸款的項目,只有當客戶端是在到期日上的60多天晚任何它

+0

你確定要使用'UNION'而不是'UNION ALL'嗎? – Kermit

+0

這也是一樣的,我會根據loans.id_product_type獲取物品,它總是會是一個或另一個(沒有聯盟真的發生)。 –

+2

我明白了。 ** ** **強烈建議您始終使用'UNION ALL',除非您需要刪除重複項。由於引擎跳過檢查重複項的額外步驟,因此速度要快得多。 – Kermit

回答

1

我也不太清楚,你能指望什麼,而是怎麼樣:

WITH items 
    AS (SELECT Count(*) AS quantity, 
       Min(date) AS item_date 
     FROM dbo.Get_cash_items(loans.id_cash) AS cash_item 
     HAVING loans.id_product_type = 1 
     UNION 
     SELECT Count(*) AS quantity, 
       Min(date) AS item_date 
     FROM dbo.Get_card_items(loans.id_card) AS card_item 
     HAVING loans.id_product_type = 2) 
SELECT a.* 
FROM items AS a, 
     (SELECT TOP 1 * 
     FROM items AS b 
     WHERE Datediff(day, b.item_date, Getdate()) >= 60) AS c 

它是一種CROSS JOIN的,在表C都會有一個或零行取決於是否條件滿足 - 它會加入到其他表中的每一行。

+0

這正是我所需要的。謝謝。 –

0

你有沒有嘗試過這樣的事情?

SELECT a.quantity, a.item_date 
FROM 
    (SELECT COUNT(*) AS quantity, MIN(date) AS item_date 
     FROM dbo.get_cash_items(loans.id_cash) AS cash_item 
     HAVING loans.id_product_type = 1 
    UNION 
    SELECT COUNT(*) AS quantity, MIN(date) AS item_date 
     FROM dbo.get_card_items(loans.id_card) AS card_item 
     HAVING loans.id_product_type = 2) a 
WHERE DATEDIFF(day, a.item_date, GETDATE()) >= 60 
+0

這隻會返回符合條件的行。 –

+0

@PabloMartínez您能向我們展示一些具有期望結果的樣本數據嗎? – Kermit

+0

我編輯了我的答案。如果一行符合我寫的條件,我需要獲得所有的行,否則都不行。 –

0

通常我使用CTE來選擇我想要選擇的記錄的關鍵字,然後加入。下面是一個例子嘗試:

with LateClients as 
(
    SELECT LoadId FROM Payment Where /*payment date later than 60 days*/ 
) 

SELECT  p.LoanId, 
      p.UserId 
FROM  Payment as p 
INNER JOIN LateClients as LC 
ON   p.LoanId = lc.LoanId 
OrderBy p.LoanId, p.UserId 

我知道這是從你們發佈的代碼有點不同,但是這是要解釋這個概念一個簡單的例子。祝你好運!

+0

這隻會帶來日期晚於60天的付款,而且我希望所有付款即使其中只有一個是最後一天。 @WojtusJ的解決方案可以做到這一點。 –

+0

我不知道你的表格是如何構建的,所以我不能說這是否屬實。我可以說的是,如果您的付款表具有LoanId列,那麼上述查詢將爲特定貸款帶來所有付款,如果該貸款的付款時間晚於60天。它不僅會選擇延遲付款。 –

相關問題