ВЫБЕРИТЕ внутренние объединенные столбцы, где только один столбец не может иметь повторяющуюся запись - PullRequest
0 голосов
/ 21 июля 2011

Я хочу выбрать внутренние объединенные таблицы, и если в столбце D есть повторяющаяся запись, не отображать всю внутреннюю объединенную строку.

Таблица 1

a b 
1 car
1 boat
1 man

Таблица2

c  d
1  dog   *dog is a duplicate, so only display it once. 
1  dog
1  cat

Вот мое внутреннее объединенное выражение sql select:

SELECT DISTINCT
a b c d FROM 
table1 INNER JOIN 
table2 ON table1.a = table2.c
WHERE <duplicate> NOT ALREADY IN RESULT

Результат должен быть:

1 car 1 dog
*1 boat 1 dog* <--dog is a duplicate so should not be displayed
1 man 1 cat

Ответы [ 3 ]

1 голос
/ 21 июля 2011

Похоже, вы хотите, чтобы из двух таблиц были взяты произвольные пары, если во втором столбце нет повторяющихся значений.Независимо от того, получаете ли вы автомобиль / собаку или лодку / собаку, вы просто не хотите получать оба.

declare @Table1 table ( id1 Int, value1 VarChar(8) )
insert into @Table1 ( id1, value1 ) values ( 1, 'car' )
insert into @Table1 ( id1, value1 ) values ( 1, 'boat' )
insert into @Table1 ( id1, value1 ) values ( 1, 'man' )

declare @Table2 table ( id2 Int, value2 VarChar(8) )
insert into @Table2 ( id2, value2 ) values ( 1, 'dog' )
insert into @Table2 ( id2, value2 ) values ( 1, 'dog' )
insert into @Table2 ( id2, value2 ) values ( 1, 'cat' )

-- All combinations.
select value1, value2, Row_Number() over ( order by value2 ) as 'RowNumber'
  from @Table1 as L inner join @Table2 as R on L.id1 = R.id2

-- Some combinations in which values in the second column do not recur.
select value1, value2
  from ( select value1, value2, Row_Number() over ( order by value2 ) as 'RowNumber'
    from @Table1 as L inner join @Table2 as R on L.id1 = R.id2 ) as Blue
  where RowNumber = ( select min( RowNumber ) from
    ( select value1, value2, Row_Number() over ( order by value2 ) as 'RowNumber'
    from @Table1 as L inner join @Table2 as R on L.id1 = R.id2 ) as Grey where value2 = Blue.value2 )
1 голос
/ 17 сентября 2011
SELECT DISTINCT
table1.a, table1.b, tab2.c, tab2.d 
FROM
table1 
INNER JOIN
(SELECT table2.c, table2.d AS tab2) ON table1.a = tab2.c
GROUP BY tab2.d
1 голос
/ 21 июля 2011

Я верю, что это то, что он ищет, спасибо за поспешный минус.Обратите внимание, что я изменил только данные испытаний, поскольку они показались неверными.

declare @t1 table(a int, b varchar(5)) 
declare @t2 table(c int, d varchar(5)) 

insert @t1 
select 1, 'car'  union all--*
select 2, 'boat' union all--*
select 3, 'man'

insert @t2
select 1, 'dog' union all--*
select 2, 'dog' union all--*
select 2, 'dog' union all--*
select 3, 'cat'

SELECT 
a, b, c, d FROM 
@t1 t1 INNER JOIN 
@t2 t2 ON t1.a = t2.c
GROUP BY a,b,c,d
HAVING COUNT(*) = 1

Добавил «все» в мои союзы благодаря острому глазу JNK

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