SQL 查询未返回正确结果

SQL query not returning correct result

我有一个包含多个连接的查询,其中 DOC_TYPE 列变为 NULL,即使其中有一些值。查询如下

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_type值为428,其描述来自

select type_desc 
from type_mst_a 
where master_mkey = 428

as Drawing 但是当我 运行 连接查询时,我得到它作为 NULL。为什么 ??

我正在使用 SQL Server 2005。

因为您正在执行左联接,所以联接子句中的所有条件都需要满足联接的 table 中的 return 个值,否则它们将为空。即

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

如果您将 LEFT JOIN 更改为 INNER JOIN,我敢打赌您不会得到任何结果,对吗?

如果您简单地对两个 table 执行 select 查看您的 master_mkey = 428,您应该看到其中一个字段(a.dept_received、a.emp_received) 的值与 428 不同,这就是您得到空值的原因。

我认为将 LEFT OUTER JOIN 更改为 INNER JOIN 可以解决您的问题。 (因为你从左边 table 获取 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' 

您必须使用内部联接而不是左联接才能获得具有 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'

讨论后当前版本是

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'

如果结果中仍必须存在 inward_doc_tracking_hdr 行具有 NULL 或没有匹配项,则需要 LEFT JOIN。 希望我们现在走在正确的轨道上。