TSQL: получить 1 верхнюю строку из одной из таблиц в JOIN - PullRequest
0 голосов
/ 19 декабря 2011

Вот что у меня есть:

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

То, что я хотел бы иметь, это вернуть только 1 строку для каждого значения в # temp1. Так что, если у меня 102 в # temp1 и 102 в ttemp, я должен увидеть эту строку. (НЕ 0102) Если у меня есть 103 в # temp1, но только 0103 в ttemp, то я должен увидеть эту строку (потому что в ttemp нет 103). Так что я просто хочу расставить приоритеты INNER JOIN: если t1.col1 = # temp1.ref1, то просто используйте это; не t1.col1 = '0' + # temp1.ref1.

SELECT from # temp2 показывает это сейчас:

ref1    refdata
101         aaaaaaaaaaaaaa
102         bbbbbbbbbbbbbb
0102        bbbbbbbbbbbbbb
0103        cccccccccccccc

И я хочу это:

ref1    refdata
101         aaaaaaaaaaaaaa
102         bbbbbbbbbbbbbb
0103        cccccccccccccc

Ответы [ 4 ]

4 голосов
/ 20 декабря 2011

Чтобы «расставить приоритеты», вам нужно искать два условия отдельно, а затем использовать COALESCE, чтобы выбрать только один результат.Вы можете повторить COALESCE в SELECT для столько столбцов, сколько необходимо для возврата из таблицы 2.

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
2 голосов
/ 20 декабря 2011
SELECT *
FROM table1 t1 
INNER JOIN table2 t2 
on t1.col = t2.col 
OR (t1.col <> t2.col AND t1.col = '0' + t2.col)
1 голос
/ 20 декабря 2011

Если вы делаете это в 2 шага, это довольно просто:

  1. Сначала вставьте строки с высоким приоритетом в выходную таблицу
  2. Вставить строки с низким приоритетом в выходную таблицу, исключая те, которые уже подарок от первой вставки. (Достигается с помощью левого соединения в этом случае)
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

Вот еще один способ, основанный на ответе Джо Стефанелли и изменив его для получения требуемых результатов:

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
1 голос
/ 19 декабря 2011

Попробуйте это:

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 

Всегда пытайтесь сравнивать похожие типы без неявного приведения.Это доставит вам меньше проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...