2013-06-09 6 views
-5

У меня есть две таблицы:Объединение двух таблиц в SQL

t1:

SSN   NAME  LAST  AD   SAL 
-------------- ---------- ---------- ----- ---------- 
s1    paps        2600 
s2    raj        1500 
s3    rahul 

t2:

SSN  NAME  LAST  AD   SAL 
---------- ---------- ---------- ----- ---------- 
s1     mukh  sbc 
s2     sar  mdn 
s3     das  tly   1100 

Я хочу, чтобы объединить эти два таблицы в один, как

t3 :

ssn name last ad sal 
---- ----- ----- ---- ---- 
s1 paps mukh sbc 2600 
s2 raj sar mdn 1500 
s3 rahul das tly 1100 

Как это сделать?

+0

Просьба уточнить, если вы хотите вставить или CREATE/SELECT – Terence

+2

Полезно помечать вопросы баз данных с помощью программного обеспечения базы данных используется, например, MySQL или SQL Server 2008R2. – HABO

+1

[Что, собственно, вы пробовали?] (Http://whathaveyoutried.com) –

ответ

0
SELECT 
    * 
FROM t1 
    UNION ALL 
SELECT 
    * 
FROM t2 
+0

выход такой же, как и таблица t2. –

2

хорошо у вас есть 4 разных способа слияния таблицы.

  • Прежде всего, вы можете создать запрос, который дает результат, как если бы это было слияние:

простое соединение:

TSQL

  • или вы можете создать представление, которое представляет собой новую таблицу, значения которой обновляются в реальном времени по запросу:

используя вид:

create or replace view t3 as 
select ssn, t1.name, t2.last, t2.ad, MAX(t1.sal, t2.sal) 
    from t1, t2 
where t1.ssn = t2.ssn; 
  • или третий вариант, вы можете создать новую таблицу на основе значений предыдущего:

или создать новую таблицу, и вставка значения двух других

create table t3 (ssn, name, last, ad, sal); 
insert into t3 select ssn, t1.name, t2.last, t2.ad, MAX(t1.sal, t2.sal) 
       from t1, t2 
       where t1.ssn = t2.ssn; 

у вас есть выбор оружия! :-)

о запросе, вы можете сделать более сложным присоединиться, чем я писал в моих примерах, а именно:

select * 
    from t1, t2 
where t1.ssn = t2.ssn 
    and t1.name = t2.name 
    and (t1.last = t2.last 
    or t1.ad = t2.ad 
    or t1.sal = t2.sal); 

как я на самом деле не получить логику в вашем t3 join table, я действительно не вижу, что вы хотите в качестве условия. как объявление столбца, которое имеет строку abc, которая исходит из ниоткуда. Но вы можете заменить AND на OR в предыдущем запросе, чтобы изменить поведение выбора и добавить выражения IF(), чтобы выбрать значение ...

нормально, то вот обзор запросов, которые могут удовлетворить ваши потребности (если sal это номер):

select t1.ssn, t1.name, t2.last, t2.ad, MAX(t1.sal, t2.sal) 
    from t1, t2 
where t1.ssn = t2.ssn; 

или

select t1.ssn as ssn, 
     t1.name as name, 
     t2.last as last , 
     t2.ad as ad, 
     if(t1.sal is null,t2.sal,t1.sal) as sal 
    from t1, t2 
where t1.ssn = t2.ssn; 

или

select t1.ssn as ssn, 
     t1.name as name, 
     t2.last as last , 
     t2.ad as ad, 
     case when s1.sal is null 
      then s2.sal 
      else s1.sal 
     end as sal 
    from t1, t2 
where t1.ssn = t2.ssn; 
  • В oracle и postgresql (но не mysql и sqlite), вы Также есть merge statement.
+0

извините за неудобства, вызванные ... Я отредактировал таблицы, и теперь, надеюсь, у вас получится моя точка зрения. –

+0

Вы имеете в виду JOIN not JOINTURE? – Ben

+0

О, может быть, извините, я узнал, что по-французски, где мы используем слово «соединение» для «присоединения», которое могло бы также существовать на английском языке :-) – zmo

0

на основе ваших данных, которая отображается в t3, я предполагаю, что следующие соотношения между t1 и t2 при отображении на t3:

t3.ssn = (t1.ssn && t2.ssn) 
t3.name = t1.name 
t3.last = t2.name 
t3.ad = t2.last 
t3.sal = t1.sal, unless null; t2.sal otherwise 

Если эти матчи правильно, вы должны быть в состоянии потянуть данные из t1 и t2 и вставить его в t3 с помощью следующего запроса:

INSERT INTO t3 (ssn, name, last, ad, sal) (
    SELECT 
     t1.ssn, t1.name, t2.name, t2.last, IF(t1.sal IS NOT NULL, t1.sal, t2.sal) 
    FROM 
     t1 
     JOIN t2 ON t1.ssn = t2.ssn 
); 
+0

furniturey: ваша логика правильная, но sql неверна ... ее ошибка при выдаче "ERROR в строке 3: ORA-00907: отсутствует правая скобка" –

+0

Это потому, что вы только что добавили тег Oracle @SayantanMukherjee. Это недействительно в Oracle. Убедитесь, что вы _allways_ пометите свой вопрос с помощью РСУБД, которую вы используете. – Ben

0
SELECT t1.ssn,t1.name,t2.name,t2.ad,t1.sal FROM table t1 JOIN table t2 on t1.ssn=t2.ssn 

Попробуйте это и посмотреть

+0

Уход за разработкой? Более полезно объяснить, что вы делаете, и научить OP что-то, чем просто раздавать решения. –

+0

Im выбирает нужный столбец из двух таблиц и соединяется с тем же значением ключа. –

1

Вы говорите, что вы хотите «слить» таблицу, но не дает достаточно деталей, чтобы дать уверенный ответ без каких-либо предположений. Три вопроса приходят на ум:

  1. Если есть повторяющиеся строки, имеет ли одна из таблиц приоритет?
  2. У двух таблиц всегда одинаковое количество строк?
  3. Вы действительно переставляете элементы во второй таблице на один столбец?

Основываясь на ваших данных, я бы сказал, что таблица 1 имеет приоритет. Я не люблю предполагать (2) из ​​выборки только трех строк. Я предполагаю (3), так как это структурирование данных.

Таким образом, способ сделать это через full outer join:

select coalesce(t1.ss1, t2.ssn) as ssn, t1.NAME, 
     coalesce(t1.last, t2.name) as last, 
     coalesce(t1.ad, t2.last) as ad, 
     coalesce(t1.sal, t2.sal) as sal 
from table1 t1 full outer join 
    table2 t2 
    on t1.ssn = t2.ssn; 
+0

, что не дает правильного выходного результата, такой же, как в таблице 2. –

Смежные вопросы