2016-05-17 128 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'