Простое объединение дает ненужные строки, Как правильно получить соединение только с совпадениями в обеих таблицах - PullRequest
2 голосов
/ 11 марта 2010
Table 1
Field1 Field2  
AA 20
AA 20
AB 12
AC 13

Table2
field3 field4
AA 20
AA 20
AC 13
AD 23
AW 21

Требуется вывод:

newfield field2 field4
AA   20 20
AA   20 20
AC   13 13

Я использовал:

 select field1 as newfield, t1.field2,t2.field4
      from table1 t1 join table2 t2 on t1.field1=t2.field3

Это не дает требуемый вывод, Пожалуйста, дайте мне знать, как получить требуемый вывод, За многие спасибо Я не могу использовать различные, так как мне нужен данный вывод, это не дубликаты, другие значения столбцов отличаются для этих строк

Ответы [ 3 ]

1 голос
/ 11 марта 2010

ОБНОВЛЕНИЕ: ОК, теперь я думаю, что я теперь, что вы пытаетесь сделать.Вы хотите, чтобы каждая строка в первой таблице соответствовала не более чем одной строке во второй таблице.Если вы используете MS SQL, Oracle или PostgreSQL, то вы можете использовать ROW_NUMBER для унификации ваших строк:

SELECT Field1 AS newfield, Field2, field4
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS rn
     FROM Table1) AS T1
JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY field3 ORDER BY field4) AS rn
     FROM Table2) AS T2
ON T1.Field1 = T2.field3 AND T1.rn = T2.rn
ORDER BY Field1

Результат:

'AA', 20, 20
'AA', 20, 20
'AC', 13, 13

Если вы используете MySQL, вы можете имитировать ROW_NUMBER, используяпеременные:

SELECT Field1 AS newfield, Field2, field4
FROM
(SELECT
    Field1,
    Field2,
    @rn := CASE WHEN @last = Field1 THEN @rn + 1 ELSE 1 END AS rn,
    @last := Field1
FROM Table1, (SELECT @rn := 0, @last = NULL) AS vars
ORDER BY Field1) AS T1
JOIN
(SELECT
    Field3,
    Field4,
    @rn := CASE WHEN @last = Field3 THEN @rn + 1 ELSE 1 END AS rn,
    @last := Field3
FROM Table2, (SELECT @rn := 0, @last = NULL) AS vars
ORDER BY Field3) AS T2
ON T1.Field1 = T2.field3 AND T1.rn = T2.rn
ORDER BY Field1

Результат:

'AA', 20, 20
'AA', 20, 20
'AC', 13, 13
0 голосов
/ 11 марта 2010

Я предполагаю, что это то, что вы ищете, но ваша выборка данных слишком мала, чтобы действительно сказать, что происходит:

select field1 as newfield, t1.field2, t2.field4
from table1 t1 
inner join (
    select distinct field3, field4 
    from Table2
) t2 on t1.field1 = t2.field3 
0 голосов
/ 11 марта 2010
select * from
(select field1 as newfield, t1.field2,(SELECT DISTINCT field4 from table2 t2 where t1.field1=t2.field3) as field4
      from table1 t1)
      where field4 is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...