这就是我所拥有的:
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
答案 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)
如果你分两步完成,那就很容易了:
- 首先将高优先级行插入输出表
- 将低优先级行插入输出表中,不包括任何已排除的行 从第一个插入物出现。 (在这种情况下通过左连接实现)
醇>
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