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。
希望我们现在走在正确的轨道上。
我有一个包含多个连接的查询,其中 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。
希望我们现在走在正确的轨道上。