2016-05-17 130 views
0

我有一個多個連接的查詢,其中DOC_TYPE列即將到來NULL,即使它有一些值。查詢低於SQL查詢不返回正確的結果

SELECT 
    a.mkey, 
    c.type_desc DOC_TYPE, 
    a.doc_no INWARD_NO, 
    CONVERT(VARCHAR, a.doc_date, 103) date, 
    a.to_user, 
    a.No_of_pages, 
    Ref_No, 
    c.type_desc DEPT_RECEIVED, 
    c.type_desc EMP_RECEIVED, 
    b.first_name + ' ' + b.last_name NAME, 
    b.email 
FROM 
    inward_doc_tracking_hdr a 
LEFT JOIN 
    user_mst b ON a.to_user = b.mkey 
LEFT JOIN 
    type_mst_a c ON a.doc_type = c.master_mkey 
       AND a.dept_received = c.Master_mkey 
       AND a.emp_received = c.Master_mkey 
WHERE 
    a.to_user = '1279' 

doc_type428,其應將描述來自

select type_desc 
from type_mst_a 
where master_mkey = 428 

Drawing但是當我運行的連接查詢,我得到它爲NULL。爲什麼?

我使用SQL Server 2005的

+0

檢查你的數據,是否最後ON謂詞滿意? – Serg

+0

@Serg:你在說什麼,我沒有得到你? – BNN

+0

我的意思是'a.doc_type = c.master_mkey和 a.dept_received = c.Master_mkey和 a.emp_received = c.Master_mkey'謂詞,你說'a.doc_type' = 428,那麼'a.dept_received'和'a.emp_received'? – Serg

回答

1

在討論當前的版本是

SELECT 
    a.mkey, c.type_desc DOC_TYPE, a.doc_no INWARD_NO, 
    convert(varchar, a.doc_date,103) date, a.to_user, a.No_of_pages, Ref_No, d.type_desc DEPT_RECEIVED, 
    b.first_name + ' ' + b.last_name SENDER, b.first_name + ' ' + b.last_name NAME, b.email 
FROM inward_doc_tracking_hdr a 
-- LEFT ? 
JOIN user_mst b ON a.to_user = b.mkey 
JOIN type_mst_a c ON a.doc_type = c.master_mkey 
JOIN type_mst_a d ON a.dept_received = d.Master_mkey 
WHERE 
    a.to_user = '1279' 

LEFT JOIN需要,如果inward_doc_tracking_hdr行與空值或沒有比賽還是必須存在的結果。 希望我們現在走在正確的軌道上。

0

因爲你執行的是左連接,所有的加盟子句中的條件需要滿足從連接表返回值,否則他們會爲空。即

a.doc_type = c.master_mkey AND 
    a.dept_received = c.Master_mkey AND 
    a.emp_received = c.Master_mkey 

如果您將您的左連接更改爲INNER JOIN,我敢打賭,您完全沒有結果?

如果您只是在查看master_mkey = 428的兩個表上執行選擇,您應該看到其中一個字段(a.dept_received,a.emp_received)的值與428的值不同,這就是您的原因得到一個null。

0

我覺得改變LEFT OUTER JOININNER JOIN會解決你的問題。 (因爲你是左表中獲取doc_no)

SELECT a.mkey, 
      c.type_desc      DOC_TYPE, 
      a.doc_no       INWARD_NO, 
      CONVERT(VARCHAR, a.doc_date, 103) date, 
      a.to_user, 
      a.No_of_pages, 
      Ref_No, 
      c.type_desc       DEPT_RECEIVED, 
      c.type_desc       EMP_RECEIVED, 
      b.first_name + ' ' + b.last_name NAME, 
      b.email 
    FROM inward_doc_tracking_hdr a 
    INNER JOIN user_mst b 
     ON (a.to_user = b.mkey) 
    INNER JOIN type_mst_a c 
     ON (a.doc_type = c.master_mkey 
     AND a.dept_received = c.Master_mkey 
     AND a.emp_received = c.Master_mkey) 
    WHERE a.to_user = '1279' 
+0

沒有返回任何記錄與您的答案 – BNN

0

而是左的加入,你必須使用才能內連接來獲得有DOC_TYPE記錄。此查詢將幫助您:

SELECT a.mkey, 
     c.type_desc      DOC_TYPE, 
     a.doc_no       INWARD_NO, 
     CONVERT(VARCHAR, a.doc_date, 103)date, 
     a.to_user, 
     a.No_of_pages, 
     Ref_No, 
     c.type_desc      DEPT_RECEIVED, 
     c.type_desc      EMP_RECEIVED, 
     b.first_name + ' ' + b.last_name NAME, 
     b.email 
FROM inward_doc_tracking_hdr a 
     INNER JOIN user_mst b 
       ON a.to_user = b.mkey 
     INNER JOIN type_mst_a c 
       ON a.doc_type = c.master_mkey 
       AND a.dept_received = c.Master_mkey 
       AND a.emp_received = c.Master_mkey 
WHERE a.to_user = '1279'