我会尽量详细说明。我们的公司控制员已向我询问有关供应商的一些信息。以下是表格:
spp
=供应商表,每个供应商有一条记录,有5222条记录
ast
=供应商帐户配置文件,此表与spp之间存在(M,1)关系,此表中有8,950条记录。每个重复的spp_id都有一个不同的atp_id,这是一个事务配置文件
crt
=银行帐户信息,供应商可能有也可能没有银行帐户信息
xvd
=检查表的表,xvd.xcd_id是保存检查表id的字段。检查表0007是包含折扣信息的表。
这是我的剧本:
select spp.spp_id supp_num,
spp.spp_matchname supp_name,
case when spp.spp_ddcalculation = 0
then 'End of Month'
else
case when spp.spp_ddcalculation = 1
then 'Net'
else
case when spp.spp_ddcalculation = 2
then 'End of 10, 20, 30'
else
case when spp.spp_ddcalculation = 3
then 'End of 15 or 30'
else null
end
end
end
end calculation1,
convert(varchar(2), spp.spp_ddduration) + case when spp.spp_ddmd = 0
then ' Days'
else case when spp.spp_ddmd = 1
then ' Months'
else null
end
end duration1,
spp.spp_ddday stop_day1,
xvd.xvd_desc discount,
crt.crt_name bank,
case when ast.ast_ddcalculation = 0
then 'End of Month'
else
case when ast.ast_ddcalculation = 1
then 'Net'
else
case when ast.ast_ddcalculation = 2
then 'End of 10, 20, 30'
else case when ast.ast_ddcalculation = 3
then 'End of 15 or 30'
else null
end
end
end
end
calculation2,
convert(varchar(2), ast.ast_ddduration) + case when ast.ast_ddmd = 0
then ' Days'
else case when ast.ast_ddmd = 1
then ' Months'
else null
end
end
duration2,
ast.ast_ddday stop_day2
from spp left join ast on spp.spp_id = ast.spp_id
left join crt on ast.crt_id = crt.crt_id
inner join xvd on ast.cfd_id = xvd.xcv_id
where xvd.xcd_id = '0007'
and xvd.lng_id = 0
order by spp.spp_id
问题是ast表中有371条记录具有非null cfd_id,这是与检查表0007中的折扣相关的字段。当我运行时,我得到371条记录,但我需要所有供应商,即使是那些有零折扣的人。我知道问题是我的连接和检查表0007中没有空xcv_id的事实。任何人都可以看到我忽略的任何明显的东西吗?
总结一下,ast中有8,950条记录,但只有371条记录为非null cfd_id。我需要抓住所有8,950条记录,我似乎无法提取空折扣。我想我可以将所有内容都放到临时表中然后获取折扣,但我想知道是否有办法在一个选择语句中执行此操作。
由于
贝
编辑:我的from语句的最后一行似乎是主要问题
inner join xvd on ast.cfd_id = xvd.xcv_id
没有null xcv_id但是有cfd_id。除了检查相等性之外,还有另一种方法可以加入这两个表吗?
忘记提及,我们在SQL Server 2008 R2上。
答案 0 :(得分:0)
我认为您可以将内部联接更改为左联接:
from spp left join ast on spp.spp_id = ast.spp_id
left join crt on ast.crt_id = crt.crt_id
inner join xvd on ast.cfd_id = xvd.xcv_id
到
from spp left join ast on spp.spp_id = ast.spp_id
left join crt on ast.crt_id = crt.crt_id
left join xvd on ast.cfd_id = xvd.xcv_id
如果您要选择xvd.xcd_id
为0007
或null
的记录,请将where子句更改为:
(xvd.xcd_id = '0007' OR xvd.xcd_id is null)
答案 1 :(得分:0)
这是否解决了这个问题?
FROM spp
LEFT JOIN ast
ON spp.spp_id = ast.spp_id
LEFT JOIN crt
ON ast.crt_id = crt.crt_id
INNER JOIN xvd
ON xvd.xcv_id = ast.cfd_id
WHERE xvd.xcd_id = '0007'
AND xvd.lng_id = 0
答案 2 :(得分:0)
这听起来非常适合观看。您可以构建一系列视图,这些视图可以按照您希望的方式过滤数据,而不是尝试构建一个复杂的查询...然后将最终查询应用到最后一个视图。