在sql server 2008中选择具有like和case语句的查询

时间:2013-07-17 09:50:11

标签: sql-server-2008

我有一张桌子

--------------------
ID | Name | RollNO
--------------------
1  | A    | 18
--------------------
2  | B    | 19RMK2
--------------------
3  | C    | 20
--------------------

我的第二张表是

-----------------------
OldRollNo | NewRollNo
-----------------------
18        |  18RMK1
-----------------------
19        |  19RMK2
-----------------------
20        |  20RMK3
-----------------------
21        |  21RMK4
-----------------------
22        |  22RMK5
-----------------------

我希望得到的表格像

----------------------------------
ID | Name | RollNo | LatestRollNo
----------------------------------
1  | A    | 18     | 18RMK1
----------------------------------
2  | B    | 19RMK2 | 19RMK2
----------------------------------
3  | C    | 20     | 20RMK3
----------------------------------

选择查询会是什么样的?这只是我问题的复制品。我使用了CASE语句和select查询,但由于我的表中的记录很大,所以花费了太多时间。在我的第二个表中,OldRollNo列是唯一的。更多的事情是,如果新分配的RollNo已经存在,则在生成的RollNo列中,应该将其精确复制到下一列,即LatestRollNo。我只需要检查那些旧的RollNo。 感谢。

4 个答案:

答案 0 :(得分:1)

您需要使用内连接。

SELECT t1.ID,t1.Name,t2.RollNo,t2.NewRollNo AS LatestRollNo
FROM Table1 t1
INNER JOIN Table2 t2
ON t1.RollNo=t2.OldRollNo OR t1.RollNo=t2.NewRollNo

答案 1 :(得分:1)

select f.ID, f.name, f.RollNo, s.NewRollNo as "Latest RollNo"
from FirstTable f 
inner join 
SecondTable s on f.RollNo = s.OldRollNo or f.RollNo = s.NewRollNo

答案 2 :(得分:1)

select t.id,t.name,t.rollno,tt.newrollno as latestrollno from
talble1 t
left join
table2 tt on t.rollno = tt.oldrollno

答案 3 :(得分:1)

尝试这样的事情:

select t1.ID
  , t1.Name
  , t1.RollNO
  , LatestRollNO = coalesce(n.NewRollNo, o.NewRollNo)
from t1
  left join t2 o on t1.RollNO = o.OldRollNo
  left join t2 n on t1.RollNO = n.NewRollNo

SQL Fiddle with demo

听起来你的问题是表现而不是逻辑;假设您在t2.OldRollNot2.NewRollNo上有适当的索引,那么这样的事情应该有希望允许使用适当的索引。

OR子句中CASEWHERE的问题在于,这些问题并不总是适用于有效的查询;希望这对你的情况更有用。