自我加入,为表

时间:2016-01-14 13:42:07

标签: sql sql-server

我正在使用一堆嵌套选择,连接和外部应用来获得此结果,

 ╔═════╦════════╦══════════╦ 
 ║ ID  ║ Name   ║ RandomID ║ 
 ╠═════╬════════╬══════════╬ 
 ║ 1   ║ a      ║     3    ║ 
 ║ 2   ║ b      ║     2    ║ 
 ║ 3   ║ c      ║     1    ║ 
 ╚═════╩════════╩══════════╩ 

我想要的,

 ╔═════╦════════╦══════════╦══════════════╦ 
 ║ ID  ║ Name   ║ RandomID ║ Random Name  ║
 ╠═════╬════════╬══════════╬══════════════╬
 ║ 1   ║ a      ║     3    ║     c        ║
 ║ 2   ║ b      ║     2    ║     b        ║
 ║ 3   ║ c      ║     1    ║     a        ║
 ╚═════╩════════╩══════════╩══════════════╩

因此,如果查询原型是,

Select ID, Name, dbo.SomeFunction(@ID)
FROM (Tables + Joins)
WHERE xxx

现在我应该对具有ID和Name的表进行内部联接并从那里获取Random Name列,还是我应该如何加入上面的查询?

我想记住表现。

2 个答案:

答案 0 :(得分:4)

您可能想要使用CTE:

with t as (
      <your query here>
     )
select t.id, t.name, t.randomid, trand.name as randomname
from t left join
     t trand
     on t.randomid = trand.id;

通过使用CTE,您无需多次重复逻辑或使用临时表。

答案 1 :(得分:3)

这样的事情对你有用:

select t1.ID
     , t1.Name
     , t1.RandomId
     , t2.Name as RandomName
from tbl t1
join tbl t2 on t1.RandomID = t2.ID