2012-10-05 131 views
3

我有以下表讓所有記錄,包括不匹配的記錄

付款

PayTypeId,說明

  • 0,信用
  • 1,借記
  • 2人,碩士

Ac tualPayment 標識,PayTypeId,金額

  • 1,1,10

這裏是輸出我在看

標識,PayTypeId,金額

  • 1,0 ,NULL
  • 1,1,10
  • 1,2,NULL

基本上我希望ActualPayment的所有記錄包括所有付款類型。

下面是我用,但我沒有得到任何記錄

select 
* 
from #ActualPayments ap 
left join #Payment p on ap.paytypeid = p.paytypeid 
where p.paytypeid is null 
+0

使用OUTER連接 – Randy

+7

@Randy - 一個'LEFT JOIN' *** ***是外聯接...... – MatBailie

回答

2

如果你想爲三個PayTypeID值中的一個記錄,那麼你需要在LEFT JOIN的左側的三個記錄。

同樣,如果您想要在每個輸出行上輸入ActuallPaymentID,則該值需要位於左側。

這一切都會導致您錯誤地認識到您擁有的數據以及您所描述的表格。


只需在你的問題這兩個表的,我會用這個佈局,而不是...

SELECT 
    ap.ActualPaymentID, 
    p.PayTypeID, 
    SUM(CASE WHEN ap.PayTypeID = p.PayTypeID THEN ap.Amount END) AS Amount 
FROM 
    ActualPayments     AS ap 
CROSS JOIN 
    Payment       AS p 
GROUP BY 
    ap.ActualPaymentID, 
    p.PayTypeID 
+0

已更新的答案更正了語法錯誤:我忘記在'CASE'語句中放置一個'END'。 – MatBailie

+0

這是一個非常好的答案(+1) – acatt

+0

Dems-你的查詢是完美的。非常感謝。其他查詢我得到重複 – VKarthik

0

我想你想完全外部聯接的查詢:

select 
* 
from #ActualPayments ap 
full outer join #Payment p 
    on ap.paytypeid = p.paytypeid 
; 

這將一起返回從ActualPayments表中的所有行與支付的相應值 - 如果有的話。此外,它將返回Payment沒有ActualPayments存在的所有行。
請注意:您的示例查詢的where子句一定不能使用!

+0

給'NULL's在'ap.ID'場(其中PayTypeID爲0或者2) 。這與OP的期望輸出不匹配。 – MatBailie

+0

OPs樣本數據很可能是當時虛構的。該ID從哪裏來? –

+0

OPs問題:'基本上我想要ActualPayment的所有記錄,包括所有支付類型.' OP的問題的解釋:返回一個記錄,用於'ActualPaymentID'和'PayTypeID'的每個不同組合,包括*(這裏我假設; ActualPaymentID不唯一)*與每個組合對應的'金額'的總和。 * [這意味着ActualPaymentID來自ActualPayment表,在這種情況下。看到我的例子答案。] * – MatBailie

2

您還沒有收到任何記錄,因爲你與WHERE條款p.paytypeid is null

嘗試沒有WHERE條款運行它過濾所有的東西。

編輯:下面的SQL應該返回正確的信息。我用CROSS JOIN創建了一個內嵌視圖。這應該刪除不需要的NULL

SELECT t1.id, t1.paytypeid, t2.amount 
FROM ( 
    SELECT id, payment.paytypeid 
    FROM #ActualPayments 
    CROSS JOIN #Payment 
) t1 
LEFT OUTER JOIN #ActualPayments t2 
    ON t1.paytypeid = t2.paytypeid 
; 
+1

仍然無法正常工作。按照您的描述進行操作會得到1條記錄,操作步驟會顯示3條期望的輸出記錄。 – MatBailie

+0

@請問您是否正確。我剛剛測試過這個,因爲需要'RIGHT OUTER JOIN'。 – acatt

+1

使用'RIGHT OUTER JOIN','PayTypeID'永遠不會爲NULL,但其中兩行的'ActualPaymentID'爲NULL。輸出仍然不匹配。 – MatBailie

0

我很困惑,爲什麼你會想這樣做,但這裏有一個方法

select ap.Id, pt.PayTypeId, ap2.Amount 
from #ActualPayments ap 
    cross join #PaymentTypes pt 
    left join #ActualPayments ap2 
    on pt.PayTypeId = ap2.PayTypeId 
    and ap.Id = ap2.id 
相關問題