如果在SQL Select语句中
我正在写一份报告,从日记账交易中返回供应商名称。下面是查询的基础知识 我使用的数据来自两个视图:如果在SQL Select语句中,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在写一份报告,从日记账交易中返回供应商名称。下面是查询的基础知识 我使用的数据来自两个视图: 日志详细信息视图=pa\u日志详细信息 供应商详细信息视图=ap\u供应商 匹配供应商编号: 供应商编号包含在以下字段中: ap\u供应商。供应商编号 pa_journal_detail.jl_ref1[在如下所示的特定标准下]仅当日志源代码为“API”或“APM”时 源代码存储在字段pa\u journal\u detail中。jl_源代码 供应商名称存储在字段ap\u vendor.a\u
- 日志详细信息视图=
pa\u日志详细信息
- 供应商详细信息视图=
ap\u供应商
ap\u供应商。供应商编号
pa_journal_detail.jl_ref1
[在如下所示的特定标准下]仅当日志源代码为“API”或“APM”时pa\u journal\u detail中。jl_源代码
供应商名称存储在字段ap\u vendor.a\u vendor\u name
这是我开始的问题。当我尝试运行时,它返回错误的语法错误
SELECT
CASE
WHEN pa_journal_detail. jl_source_code = ‘API’
OR pa_journal_detail. jl_source_code = ‘APM’
THEN(
SELECT a_vendor_name
FROM ap_vendor
INNER JOIN pa_journal_detail
ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number)
ELSE 0
END as a_vendor_name, *
FROM pa_journal_detail
下面是完整的查询。我也尝试过,包括“前1名”。我现在得到的错误是关键字AS附近有不正确的语法
SELECT
pa_journal_detail.a_project
,pa_journal_detail.jl_seg2
,pa_journal_detail.jl_seg3
,pa_journal_detail.jl_seg4
,pa_journal_detail.jl_source_code
,pa_journal_detail.jl_ref1
,pa_journal_detail.jl_gl_org
,pa_journal_detail.jl_gl_obj
,pa_journal_detail.jl_line_num
,pa_journal_detail.jl_journal_num
,pa_journal_detail.jl_jnl_year_period
,pa_journal_detail.jl_journal_number
,pa_journal_detail.jl_journal_seq
,(SELECT(CASE
WHEN pa_journal_detail. jl_source_code = 'API'
OR pa_journal_detail. jl_source_code = 'APM'
THEN(
SELECT TOP 1 a_vendor_name
FROM ap_vendor
RIGHT JOIN pa_journal_detail
ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number
)
ELSE 0
END as 'a_vendor_name', *
FROM pa_journal_detail))
FROM pa_journal_detail
这就是我的结局,它现在起作用了!谢谢大家!
SELECT
pa_journal_detail.a_project
,pa_journal_detail.jl_seg2
,pa_journal_detail.jl_seg3
,pa_journal_detail.jl_seg4
,pa_journal_detail.jl_source_code
,pa_journal_detail.jl_ref1
,pa_journal_detail.jl_gl_org
,pa_journal_detail.jl_gl_obj
,pa_journal_detail.jl_line_num
,pa_journal_detail.jl_journal_num
,pa_journal_detail.jl_jnl_year_period
,pa_journal_detail.jl_journal_number
,pa_journal_detail.jl_journal_seq
,iif((pa_journal_detail.jl_source_code = 'API'
OR pa_journal_detail.jl_source_code = 'APM')
,(SELECT TOP 1 a_vendor_name
FROM ap_vendor
RIGHT JOIN pa_journal_detail
ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number)
,0) as 'a_vendor_name'
FROM pa_journal_detail
对于字符串比较,您需要使用单引号
CASE
WHEN pa_journal_detail. jl_source_code = 'API'
OR pa_journal_detail. jl_source_code = 'APM'
THEN(
SELECT top 1 a_vendor_name -- here you need limit or top 1
FROM ap_vendor
INNER JOIN pa_journal_detail
ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number
)
ELSE 0
END as a_vendor_name, *
FROM pa_journal_detail
我认为一个
案例
表达式可能是这份工作的错误工具。如果您有时想加入表,则左加入可能更容易:
SELECT p.*, a.a_vendor_name
FROM pa_journal_detail p
LEFT JOIN ap_vendor a ON p.jl_ref1 = a.a_vendor_number AND
p.jl_source_code IN ('API', 'APM')
还有。我使用它的频率远远超过我应该使用的频率,我只是喜欢用一个小小的if来表示简单的条件工作,而不是用大ole的Case语句
select iif(1 = 1,'True','False')
-- any series that results in a boolean
select iif((1 = 1 and 0 = 0) and (5 / 1 = 5 and 5 % 10 = 5),'True','False')
谢谢你的提问
SELECT
pa_journal_detail.a_project
,pa_journal_detail.jl_seg2
,pa_journal_detail.jl_seg3
,pa_journal_detail.jl_seg4
,pa_journal_detail.jl_source_code
,pa_journal_detail.jl_ref1
,pa_journal_detail.jl_gl_org
,pa_journal_detail.jl_gl_obj
,pa_journal_detail.jl_line_num
,pa_journal_detail.jl_journal_num
,pa_journal_detail.jl_jnl_year_period
,pa_journal_detail.jl_journal_number
,pa_journal_detail.jl_journal_seq
,iif(pa_journal_detail.jl_source_code = 'API' OR pa_journal_detail.jl_source_code = 'APM',(SELECT TOP 1 a_vendor_name
FROM ap_vendor
RIGHT JOIN pa_journal_detail
ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number)
,0)
'a_vendor_name', *
FROM pa_journal_detail))
FROM pa_journal_detail
具体错误是什么?首先,该子查询看起来应该返回多行(内部和外部数据之间没有相关性),这将导致其自身的问题。另外,是否有一些特定的原因使您没有使用左连接
?通常,使用CASE。。。()
应该避免(尽管在某些特定情况下它可能会有所帮助),因为在大多数情况下,它会模糊数据关系。当我尝试使用这种方法时,会出现以下错误:“当子查询没有引入EXISTS时,只能在select列表中指定一个表达式”@丽贝卡:这里没有子查询。您是否将此片段用作某个更大查询的一部分?是的,我正试图这么做。@Rebeccasian,我可能还不够清楚。这不会替换共享查询中的大小写
表达式,而是替换整个查询。如果这不是问题所在,并且您将此查询作为更大查询的一部分,请将其共享,我真的无法帮助您了解错误的原因。我已使用完整查询更新了问题。谢谢我尝试过这种方法和下面的示例,但在“当子查询没有引入EXISTS时,在select列表中只能指定一个表达式”上都出现了错误@Rebecca Christian在子查询中使用限制顺便问一下,您的dbms名称是什么?这是我的软件中的SQL Server数据库provider@RebeccaChristian然后使用top 1最好在top子句之后添加“order by”