TSQL:从JOIN中的一个表中获取前1行

时间:2011-12-19 18:22:37

标签: sql tsql

这就是我所拥有的:

drop table ttemp
create table ttemp(
col1 char(10),
col2 varchar(100))

INSERT INTO ttemp VALUES('101','shshsfhgs')
INSERT INTO ttemp VALUES('102','ertqehwrgs')
INSERT INTO ttemp VALUES('0102','witpipqcqp')
INSERT INTO ttemp VALUES('0103','retrtyhwqpp')


drop table #temp1
create table #temp1
(ref1 char(10),
 refdata varchar(100))

drop table #temp2
Create table #temp2
(ref1 char(10),
 refdata varchar(100))

insert into #temp1 values(101,'aaaaaaaaaaaaaa')
insert into #temp1 values(102,'bbbbbbbbbbbbbb')
insert into #temp1 values(103,'cccccccccccccc')

select * from #temp1

insert into #temp2
SELECT t1.col1, #temp1.refdata
FROM ttemp t1 
INNER JOIN #temp1 on t1.col1 = #temp1.ref1 OR t1.col1 = '0' + #temp1.ref1


select * from #temp2

我希望拥有的是#temp1中每个值只返回1行。 所以,如果我在#temp1中有102,而在ttemp中有102,我应该看到那一行。 (不是0102) 如果我在#temp1中有103,但在ttemp中只有0103,那么我应该看到那一行(因为在ttemp中没有103)。 所以我只想优先考虑INNER JOIN:如果t1.col1 =#temp1.ref1,那么只需使用那个;不是t1.col1 ='0'+#temp1.ref1。

来自#temp2的SELECT现在显示:

ref1    refdata
101         aaaaaaaaaaaaaa
102         bbbbbbbbbbbbbb
0102        bbbbbbbbbbbbbb
0103        cccccccccccccc

我想要这个:

ref1    refdata
101         aaaaaaaaaaaaaa
102         bbbbbbbbbbbbbb
0103        cccccccccccccc

4 个答案:

答案 0 :(得分:4)

为了“优先排序”,您需要分别搜索这两个条件,然后使用COALESCE仅选择一个结果。您可以在SELECT中重复COALESCE,以获得从table2返回的任意数量的列。

SELECT t1.*, COALESCE(t2a.SomeColumn, t2b.SomeColumn)
    FROM table1 t1
        LEFT JOIN table2 t2a
            ON t1.col = t2a.col
        LEFT JOIN table2 t2b
            ON t1.col = '0' + t2b.col
    WHERE t2a.col IS NOT NULL
        OR t2b.col IS NOT NULL

答案 1 :(得分:2)

SELECT *
FROM table1 t1 
INNER JOIN table2 t2 
on t1.col = t2.col 
OR (t1.col <> t2.col AND t1.col = '0' + t2.col)

答案 2 :(得分:1)

试试这个:

INSERT INTO #temp2 
SELECT DISTINCT CAST(t1.col1 AS int), #temp1.refdata 
FROM ttemp t1  
   INNER JOIN #temp1 on CAST(t1.col1 AS int) = #temp1.ref1 

总是尝试在没有隐式转换的情况下比较相似的类型。它会让你减少麻烦。

答案 3 :(得分:1)

如果你分两步完成,那就很容易了:

  
      
  1. 首先将高优先级行插入输出表
  2.   
  3. 将低优先级行插入输出表中,不包括任何已排除的行   从第一个插入物出现。 (在这种情况下通过左连接实现)
  4.   
create table ttemp( 
col1 char(10), 
col2 varchar(100)) 

INSERT INTO ttemp VALUES('101','shshsfhgs') 
INSERT INTO ttemp VALUES('102','ertqehwrgs') 
INSERT INTO ttemp VALUES('0102','witpipqcqp') 
INSERT INTO ttemp VALUES('0103','retrtyhwqpp') 

create table #temp1 
(ref1 char(10), 
 refdata varchar(100)) 

    Create table #temp2 
(ref1 char(10), 
 refdata varchar(100)) 

insert into #temp1 values(101,'aaaaaaaaaaaaaa') 
insert into #temp1 values(102,'bbbbbbbbbbbbbb') 
insert into #temp1 values(103,'cccccccccccccc') 

INSERT INTO #temp2
SELECT t1.col1, t.refdata
FROM ttemp t1
INNER JOIN #temp1 t on t1.col1 = t.ref1


INSERT INTO #temp2
SELECT t1.col1, t.refdata
FROM ttemp t1
INNER JOIN #temp1 t on t1.col1 = '0' + t.ref1
LEFT JOIN #temp2 t2 ON t.ref1 = t2.ref1
WHERE ISNULL(t2.ref1,0) = 0

SELECT * FROM #temp2

drop table ttemp 
drop table #temp1 
drop table #temp2 

结果:

ref1    refdata 
101     aaaaaaaaaaaaaa 
102     bbbbbbbbbbbbbb 
0103    cccccccccccccc

这是另一种建立在Joe Stefanelli的答案上并改变它以产生所需结果的方法:

SELECT t1.col1, COALESCE(ta.refdata,t.refdata ) [refdata]
FROM ttemp t1 
LEFT JOIN #temp1 t ON t1.col1 = t.ref1 
LEFT JOIN #temp1 ta ON t1.col1 = '0' + ta.ref1 AND ta.ref1 NOT IN (SELECT ref1 FROM ttemp INNER JOIN #temp1 ON col1 = ref1 )
WHERE ta.ref1 IS NOT NULL
OR t.ref1 IS NOT NULL

结果:

col1    refdata
101     aaaaaaaaaaaaaa
102     bbbbbbbbbbbbbb
0103    cccccccccccccc