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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2012, 14:39   #1
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
Сообщение Составить интересный запрос

Здравствуйте друзья. У меня задача созрела интересная и сложная, не могу сам догадаться, может кто подскажет?

Есть две таблицы связанные по полю Договор, в одной организации и услуги, в другой Дата

Тоесть Table1: Select Договор, организация, услуга from Договора
Table2: Select Договор. Дата from Акты

структура таблицы 1 такая:

Договор-------------Организация-----------Услуга
ОФ010-567885---------Тест---------------Комплектующие
ОФ013-567885---------Тест---------------Тех.Работа
ОФ010-892765---------Тест---------------Комплектующие
ОФ013-892765---------Тест---------------Тех.Работа
ОФ010-239653---------Тест---------------Комплектующие
ОФ013-239653---------Тест---------------Тех.Работа
ОФ013-913571---------Тест---------------Тех.Работа
ОФ010-913571---------Тест---------------Комплектующие
ОФ010-195151---------Тест---------------Комплектующие
ОФ013-195151---------Тест---------------Тех.Работа
ОФ010-315259---------Тест---------------Комплектующие
ОФ013-315259---------Тест---------------Тех.Работа

а во второй по довогорам дата, строка создается когда работа выполнена.

Вопрос: А как можно сделать выборку только договоров вида ОФ013 у которых в таблице Акты нет по этому же номеру договора записи (акт) по услуге ОФ010, я пробовал через exists но результат не тот.

Код:
Select * from Договора
Left Join Акты On Договора.Договор=Акты.Договор
where Договора.Договор like '%ОФ013%'
первоначальный запрос

Последний раз редактировалось SovereignSun; 16.04.2012 в 17:40.
SovereignSun вне форума Ответить с цитированием
Старый 16.04.2012, 17:27   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А так (при условии, что в СУБД есть функции LEFT и RIGHT, если нет, то должен быть аналог). А вообще нужно писать,что код договора - это правые 6 байтов, а левые 5 - код услуги
Код:
SELECT Договора.*
  FROM Договора
  WHERE Договора.Договор like 'ОФ013% AND
    NOT EXISTS(
      SELECT * FROM Акты 
        WHERE RIGHT(Акты.Договор,6)=RIGHT(Договора.Договор,6) AND
              LEFT(Акты.Договор,5) ='ОФ010')
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.04.2012, 17:29   #3
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Код:
Select Договора.Договор, Договора.Организация, Акты_View.[Услуга], Акты_View.[Дата] from Розн_23.dbo.Договора
Left join Розн_23.dbo.Акты_View ON Розн_23.dbo.Договора.Договор=Розн_23.dbo.Акты_View.Договор
where Договора.Договор like '%ОФ013%' and not exists (Select * from Акты_View where 
CAST((CASE WHEN CHARINDEX('-',Розн_23.dbo.Договора.Договор)>0 
THEN RIGHT(Розн_23.dbo.Договора.Договор,LEN(Розн_23.dbo.Договора.Договор)-CHARINDEX('-',Розн_23.dbo.Договора.Договор)) 
ELSE NULL END) AS varchar(20))=CAST((CASE WHEN CHARINDEX('-',Розн_23.dbo.Акты_View.Договор)>0 
THEN RIGHT(Розн_23.dbo.Акты_View.Договор,LEN(Розн_23.dbo.Акты_View.Договор)-CHARINDEX('-',Розн_23.dbo.Акты_View.Договор)) 
ELSE NULL END) AS varchar(20)) and Акты_View.Услуга like '%Комплектующие%')
Что не так в этом запросе? почему он все равно отображает те где есть Комплектующие, зато не отображает те где нету Тех.Работ.

СУБД SQL Server 2008 Enterprise

Весь день мучаюсь с этим запросом.. уже голова болит

Оо все понял..

Код:
Select Договора.Договор, Договора.Организация from Розн_23.dbo.Договора
where Договора.Договор like '%ОФ013%' and not exists (Select * from Акты_View where 
CAST((CASE WHEN CHARINDEX('-',Розн_23.dbo.Акты_View.Договор)>0 
THEN RIGHT(Розн_23.dbo.Акты_View.Договор,LEN(Розн_23.dbo.Акты_View.Договор)-CHARINDEX('-',Розн_23.dbo.Акты_View.Договор)) 
ELSE NULL END) AS varchar(20))=CAST((CASE WHEN CHARINDEX('-',Розн_23.dbo.Договора.Договор)>0 
THEN RIGHT(Розн_23.dbo.Договора.Договор,LEN(Розн_23.dbo.Договора.Договор)-CHARINDEX('-',Розн_23.dbo.Договора.Договор)) 
ELSE NULL END) AS varchar(20)) and LEFT(Акты_View.Договор,5)='ОФ010')
Этот вариант работает, только.. как теперь сюда вывести еще колонку Дату из Акты_View? При добавлении, еще записи некорректные по запросу добавляются

Последний раз редактировалось Stilet; 16.04.2012 в 17:51.
SovereignSun вне форума Ответить с цитированием
Старый 16.04.2012, 17:41   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Основная беда в том, что в одно поле засунули и код договора, и код услуги. Были бы отдельно - половина проблем отпала бы сама собой

ADD Акты_View по LEFT JOIN прицепить

Розн_23.dbo. зачем везде цеплять? И без этого норм будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.04.2012 в 17:47.
Аватар вне форума Ответить с цитированием
Старый 16.04.2012, 17:43   #5
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

ну сейчас уже ладно. через CAST кое-как их разделил, если учесть что бывает номер длинее 6 цифр бывает. Теперь проблема вывода связанной таблицы.

Только что пробовал, left join - еще записи, неправильные, inner join вообще не выдает записей.. right join смысла нет.

Цитата:
Сообщение от Аватар Посмотреть сообщение
Розн_23.dbo. зачем везде цеплять? И без этого норм будет
У меня там все намного сложнее по запросу на самом деле.. это просто кусок.. там разные базы данных я через один запрос их все вывожу и сравниваю в программе потом. Просто тестирую на _23 базе.

Последний раз редактировалось SovereignSun; 16.04.2012 в 17:58.
SovereignSun вне форума Ответить с цитированием
Старый 16.04.2012, 18:41   #6
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
через CAST кое-как их разделил
Интреное решение. А строковые функции почему не пригодились?
=master= вне форума Ответить с цитированием
Старый 17.04.2012, 09:18   #7
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

А там разделитель вот "-", поэтому что париться.. пусть и будет разделителем левой и правой части. До сих не получается с привязкой таблицы.
SovereignSun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересный sql запрос с картинками Radzhab Microsoft Office Access 4 15.05.2011 01:18
Составить запрос. ?? Agapov_stas SQL, базы данных 8 21.07.2010 19:32
Как составить запрос? jeka5555 SQL, базы данных 3 09.09.2009 10:12
Запрос в Visal Basic.NET(Очень интересный код) reyn90 Помощь студентам 14 21.06.2009 17:59
Необходимо составить запрос span4 SQL, базы данных 17 05.04.2009 11:43