Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2015, 01:01   #1
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию SQL Хитрое совмещение выборки из двух таблиц

Привет всем.
Есть две таблицы

платежи
Код:
T1 
  id   :integer
  payment
  paywhere
  faktura
  saledate
  paydate
  quote   :numeric
  paymonth
  info
движение денег
Код:
T2
  id  :integer
  paydate
  t1id   :integer
  info
  quote :numeric
связь такая t2.t1id=t1.id
t2.t1id может принимать NULL

в t1 платежи которые нужно заплатить
в t2 приходы, и расходы по платежам что в t1

Если в t2 попадает РАСХОД, то поле t2.t1id обязательно имеет id платежа из t1
Если в t2 попадает ПРИХОД, то поле t2.t1id равно NULL

Делаю запрос
Код:
SELECT 
    t1.id, t1.payment, t1.paywhere, t1.faktura, t1.paymonth, t2.t1id, t2.paydate, t2.quote, t2.info 
FROM 
    t1 
LEFT OUTER JOIN 
    t2 
ON 
    t1.id=t2.t1id
Получаю


меняю в запросе LEFT на RIGHT
получаю

Если добавить
Код:
ON 
    t1.id=t2.t1id OR t2.t1id is null
получаю

а мне нужно


Как нужно поправить запрос?

заранее спасибо
Yuran вне форума Ответить с цитированием
Старый 09.08.2015, 08:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что-т я не оч. понял что тебе нужно...
Вообще первая мысль, которая пришла в голову: Собрать приход и расход через union отдельными запросами. Но может ты подробнее пояснишь задачу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 15:46   #3
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Тоже подумал про UNION, но не умею им пользоваться.

Проблема в том что в t2.t1id может быть NULL.

Мне нужно сделать совместную выборку из двух таблиц результат которой показан на последнем скрине.

В принципе получается с первым запросом. (screen 1 LEFT OUTER JOIN) туда бы еще добавить дату сумму и примечание.

Если изменю запрос LEFT OUTER JOIN на RIGHT OUTER JOIN по получается screen 2, где присутствуют поля дата сумма и примечание НО отсутствуют платеж, №, назначение, фактура.

Короче совместить бы LEFT OUTER JOIN и RIGHT OUTER JOIN

Есть идеи?
Yuran вне форума Ответить с цитированием
Старый 09.08.2015, 16:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну попробуй:
Код:

SELECT 
    t1.id, t1.payment, t1.paywhere, t1.faktura, t1.paymonth
  , t2.t1id, t2.paydate, t2.quote, t2.info 
FROM 
    t1 
LEFT OUTER JOIN     t2 ON     t1.id=t2.t1id
where not t1.id is NULL

union all

SELECT 
    t1.id, t1.payment, t1.paywhere, t1.faktura, t1.paymonth
  , t2.t1id, t2.paydate, t2.quote, t2.info 
FROM 
    t1 
LEFT OUTER JOIN     t2 ON     t1.id=t2.t1id
where t1.id is NULL
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 17:03   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Yuran Посмотреть сообщение
Короче совместить бы LEFT OUTER JOIN и RIGHT OUTER JOIN
Это называется full outer join. Не знаю, поддерживает ли его SQL Server. Это же SQL Server?
Vapaamies вне форума Ответить с цитированием
Старый 09.08.2015, 18:07   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Поддерживает. Только ТС сам не знает, что хочет получить. Дай развернутый пример - нескольких записей одной и второй таблицы и что из них получить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2015, 19:44   #7
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Спасибо за советы. Попробовал все. Union, Union all, Full outer join - результат приближенный но не тот.
Самый близкий результат при запросе
Код:
SELECT 
    t1.id, t1.payment, t1.paywhere, t1.faktura, t1.paymonth, t2.t1id, t2.paydate, t2.quote, t2.info 
FROM 
    t1 
LEFT OUTER JOIN 
    t2 
ON 
    t1.id=t2.t1id

Нужно как-то вывести дату и сумму прихода


Вот данные в таблицах
T1 (платежи и приходы)

T2 (движение денег)


Результатом хочу видеть


Зачеркнутой записи вообще не должно быть. Потому что для этой записи T2.t1id is null
Yuran вне форума Ответить с цитированием
Старый 09.08.2015, 19:50   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
результат приближенный но не тот.
Ну значит ту и сам не в курсе что хочешь получить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 20:24   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну и на каком основании последняя запись должна получаться? Что делать, если в T2 100 записей с t1id=NULL? Пусть 2?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.08.2015, 09:32   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Самый близкий результат при запросе
берем его и отфильтровываем(where not) ненужное.
Код:
from t1 
LEFT JOIN t2 on ... 
              
where not (t1.назначение ='Tauron' and t2.примечание ='Persona Card')
!! наименования и данные взяты по изображению требования (зачеркнутое).
или наоборот берем только нужное
Код:
   (t1.y='tauron' and t2.x <>'card' )
or (t1.y<>'Tauron')
P.S. такое можно впихнуть и в left ...
Код:
ON  t1.id=t2.idt1 and ( (t1...<>'tauron') OR (t1...='tauron' and t2..<>'card') )
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.08.2015 в 09:43.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составление выборки из двух таблиц Simply-Art SQL, базы данных 3 29.09.2014 14:54
Проблема в выборке из двух таблиц запросом SQL Server 2012 qpash SQL, базы данных 2 19.03.2014 10:04
Получение данных из двух таблиц SQL Server а S_Yevgeniy БД в Delphi 8 27.12.2009 15:12
sql запрос на выборку записей из двух связанных таблиц Люсьен БД в Delphi 9 20.04.2009 16:07
SQL запрос из двух таблиц.(сложный) Miha87 БД в Delphi 5 10.11.2008 11:04