因此,想象一下由第一个,中间名和姓氏组成的表。
我想编写一个查询,返回所有中间名和名字,作为1列,其姓氏呈现完全神秘,复杂的质量,需要20个嵌套子查询才能确定。
一种方法是
Select FirstName From Names Where LastName in (HISTSNEROIP)
Union
Select MiddleName From Names Where LastName in (HISTSNEROIP)
HISTSNEROIP代表“巨大的低效子查询,如果可能的话甚至不应该运行一次”。顾名思义,如上所述运行两次是一个很大的禁忌。
理想情况下,我会做类似的事情
Select FirstName and MiddleName from names where Lastname in (HISTSNEROIP)
哪里'和'被任何工具所取代。
像这样的东西应该工作..
SELECT f_m
FROM (
SELECT FirstName as f_m, LastName FROM names
UNION
SELECT MiddleName as f_m, LastName FROM names
) as T
WHERE T.LastName in (HISTSNEROIP);
你可以使用CTE:
with cte (
HISTSNEROIP
)
select firstname from names where lastname in cte
union all
select middlename from names where lastname in cte
这样HISTSNEROIP只运行一次。
为什么不在一个查询中选择这个?
Select FirstName, MiddleName
From Names
Where LastName in (HISTSNEROIP)
如果需要,您可以忽略这一点:
Select (case when x.n = 1 then FirstName else MiddleName end)
From Names n cross join
(select 1 as n union all select 2 as n) x
Where LastName in (HISTSNEROIP)