我正在尝试执行此查询,该查询在where子句中包含别名,但它表示未知列。这是专栏:
select a.asofdate, pi.PShipEntID, ass.firmentid, ass.firmorindentid, concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) roles,
case when roles like '%(BM)%' then concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) else null end boardmember,
case when concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) like '%(BO)%' then concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) else null end boardobserver,
case when concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) like '%(PRP)%' then concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) else null end primaryresponsiblepartner,
case when concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) like '%(SRP)%' then concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) else null end secondaryresponsiblepartner
from asofdates a
left join associations ass
on a.asofdate > ass.StartDate
left join pshipinvestments pi
on pi.CompEntID = ass.FirmEntID
left join entities e
on ass.firmorindentid = e.InvEntID
left join individuals ind
on ind.indentid = e.InvEntID
我知道此查询很痛苦,并且在这种情况下我不能使用别名,但是无论如何,是否可以简化此查询而不是使用复杂的表达式在任何地方进行连接?
如在情况中,用case语句中的别名替换此表达式concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle))
。
预先感谢。
答案 0 :(得分:1)
我认为这可能会有所帮助。
select * from (your above mentioned query)
,然后在where
子句中使用它。
答案 1 :(得分:0)
您需要使自己成为子查询,然后在那里做一次工作。然后,您可以反复使用该列。检查以下内容,很显然我无法运行它,因为您尚未提供任何示例数据:)
select a.asofdate, pi.PShipEntID, ass.firmentid, ass.firmorindentid,
a.Name roles,
case when roles like '%(BM)%' then a.Name else null end boardmember,
case when a.Name like '%(BO)%' then a.Name else null end boardobserver,
case when a.Name like '%(PRP)%' then a.Name else null end primaryresponsiblepartner,
case when a.Name like '%(SRP)%' then a.Name else null end secondaryresponsiblepartner
from
(
select
concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) as Name,
*
asofdates
) a
left join associations ass
on a.asofdate > ass.StartDate
left join pshipinvestments pi
on pi.CompEntID = ass.FirmEntID
left join entities e
on ass.firmorindentid = e.InvEntID
left join individuals ind
on ind.indentid = e.InvEntID
where a.Name = 'Albert'
答案 2 :(得分:0)
我没有看到任何where
子句。
但是,MySQL扩展了having
的使用来处理非聚合查询。并且可以使用别名。
因此,您可以使用:
having boardobserver = @boardobserver