Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объединение 2х таблиц 
V
    Опции темы
uranpro
Дата 24.6.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



у меня есть 2 таблицы T_Real:
rPID int
rOID int
rQuantity

 T_HandeMade:
hmPID
hmOID
hmQuantity

нужно связать эти таблицы по полям PID и OID. проблема в том, что OID не всегда бывает заполнен в любой из 2 таблиц.
можно использовать left join на T_HandMade, но есть вероятность, что запрос захватит не все поля таблицы T_HandeMade или наоборот

допустим есть PID = 99, в таблице T_Real:
99 1 1
99 2 1
99 3 1

T_HandeMade:
99 2 1
99 3 1
99 4 1
99 5 1

если использовать left join для t_handemade , то выйдет 3 строчки. если же к t_real, то 4.

подскажите плз.

Добавлено через 1 минуту и 41 секунду
а нужно, что бы было

99 1 1 null null null
99 2 1 99 2 1
99 3 1 99 3 1
null null null 99 4 1
null null null 99 5 1


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Akina
Дата 24.6.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Получаем все пары PID - OID
Код

select distinct *
from 
(
    select rPID, rOID 
    from T_Real 
  union 
    select hmPI, hmOID 
    from T_HandeMade
)
и делаем left join обеих таблиц в этот подзапрос.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Deniz
Дата 25.6.2008, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



uranpro, а full join не поможет?
Т.е.
Код
select r.*, hm.*
from T_Real r
  full join T_HandeMade hm on r.rPID = hm.hmPID and r.rOID = hm.hmOID


Это сообщение отредактировал(а) Deniz - 25.6.2008, 05:20


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
uranpro
Дата 25.6.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



мм... интересно! спасибо!


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
uranpro
Дата 25.6.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Deniz, а вы уверены, что этот запрос выдаст строки, где по таблице R поля NULL ?

Добавлено через 13 минут и 26 секунд
Akina, в таблице с объединением(union) видно rPID and rOID, к hmPID and hmOID обращаться нельзя( странно, с виду кажется, что все правильно и должно работать. мб с MS SQL Server проблема или глюк?


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
uranpro
Дата 25.6.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Deniz, проверил, все работает, спасибо!


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
uranpro
Дата 25.6.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



кому интересно, вот что мне было нужно:
Код

SELECT     (CASE WHEN rPID IS NULL THEN hmPID ELSE rPID END) AS PID, 
                 (CASE WHEN rOID IS NULL THEN hmOID ELSE rOID END) AS OID, 
                 (CASE WHEN rPID IS NULL THEN hmQuantity WHEN hmPID IS NULL THEN rQuantity ELSE rQuantity + hmQuantity END) AS Quantity
FROM         dbo.v_p_realiz AS R FULL OUTER JOIN
                      dbo.v_p_real_handmade AS HM ON R.rPID = HM.hmPID AND R.rOID = HM.hmOID



--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Deniz
Дата 25.6.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



uranpro, вот это монстр, даже смотреть страшно. Про coalesce не слышал?
Код
SELECT
  coalesce(rPID, hmPID) AS PID, 
  coalesce(rOID, hmOID) AS OID, 
  (coalesce(hmQuantity, 0) + coalesce(rQuantity, 0)) as Quantity
FROM dbo.v_p_realiz AS R 
  FULL OUTER JOIN dbo.v_p_real_handmade AS HM ON R.rPID = HM.hmPID AND R.rOID = HM.hmOID


Это сообщение отредактировал(а) Deniz - 25.6.2008, 13:06


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
uranpro
Дата 25.6.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



только он работает в 4 раза медленнее, чем если открывать по отдельности запросы(для каждой таблицы)

Добавлено через 47 секунд
Deniz, ууу... нет, не слышал, я начинающий))) сейчас проверю)))

Добавлено через 3 минуты и 3 секунды
работает, спасибо!


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Deniz
Дата 25.6.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Цитата(uranpro @  25.6.2008,  16:14 Найти цитируемый пост)
только он работает в 4 раза медленнее
так это же полное объединение.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 25.6.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(uranpro @  25.6.2008,  11:25 Найти цитируемый пост)
в таблице с объединением(union) видно rPID and rOID, к hmPID and hmOID обращаться нельзя( странно, с виду кажется, что все правильно и должно работать. мб с MS SQL Server проблема или глюк? 

 smile 
Вы что, первый раз увидели UNION???


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
uranpro
Дата 25.6.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Akina, конечно же нет)

Код

select * from 
(
select 1, 2 from t1
union
select 3, 4 from t2
)


запрос покажет 2 поля : 1 и 2

Добавлено через 1 минуту и 40 секунд
Deniz, а есть другое решение проблемы ? которое работает быстрее


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Akina
Дата 25.6.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(uranpro @  25.6.2008,  16:51 Найти цитируемый пост)
запрос покажет 2 поля : 1 и 2

Как все запущено... речь не о содержимом записей, а об именах полей - так вот, они берутся из первого запроса, а те что в остальных - игнорируются. Вот поэтому имена (повторяю - ИМЕНА) полей hmPID и hmOID недоступны, но содержимое записей этих полей доступны под именами rPID и rOID.Можно было написАть и так:
Код

select distinct *
from 
(
    select rPID as PID, rOID as OID
    from T_Real 
  union 
    select hmPI, hmOID 
    from T_HandeMade
)
тогда поля имели бы имена PID и OID. Тебе же пофиг, из какой именно таблицы взята пара - было бы соответствие хотя бы в одной из таблиц.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
uranpro
Дата 25.6.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Akina, оО, этого я не знал! спасибо за информацию! сейчас проверю, мб быстрее работать будет(думаю так и будет)


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Deniz
Дата 26.6.2008, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Akina, а зачем distinct? Union без all итак дубли не пропустит.

Цитата(uranpro @  25.6.2008,  21:02 Найти цитируемый пост)
мб быстрее работать будет(думаю так и будет) 
не уверен, что будет какой-то выигрыш.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.