Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вложенный запрос [D5, MSSQL]


Shoo ©   (2002-03-11 12:16:00) 

Мастера, объясните, плз, каким образом можно получить dataset, состоящий из всех записей 1-ой таблицы, которых нет во 2-ой. пробовал 2-мя способами (ниже), но результат неверен. В SQL, увы, не силен.

1.
select * from t$bundles
where t$bundles.f$bbarkod not in
(select t$bundlesbak.f$bbarkod from t$bundlesbak)
2.
select * from t$bundles
where not exists
(select t$bundlesbak.f$bbarkod from t$bundlesbak where t$bundlesbak.f$bbarkod = t$bundles.f$bbarkod)


Shoo   (2002-03-12 09:32:00) [1]

Прошу прощения за маленькое дополнение. Последний приведенный мною запрос дает набор данных из порядка 8 тыс записей и отрабатывает на двух моих таблицах всего 5 секунд!


Shoo   (2002-03-12 09:23:00) [2]

Всем спасибо, прошу прощения, если кого отвлек от важных дел.
Разобрался сам. В качестве оправдания, решение моей задачи ниже, может кому пригодится. :)

select * from t$bundles
where not exists
(select t$bundlesbak.f$bbarkod from t$bundlesbak
where left(t$bundlesbak.f$bbarkod, 30) = left(t$bundles.f$bbarkod, 30))


roottim   (2002-03-12 09:22:00) [3]

это все верно!... , а долго потому что сравнение идет на стороне клиента... и пока оно переработает все записи долго... 60-70 это не мало...
предложение тогда такое... сделать вид на стороне сервера... и пользоваться им... самый думаю рациональный способ...
посмотри только какие там функции выполнят операцию типа Left


Shoo   (2002-03-12 09:10:00) [4]

2roottim:
Пришлось поковырять таблицы ручками, выяснилось следующее:
оказывается, совпадение должно быть не полностью по значениям полей, а по первым 30 символам (тип - строка). Идиотизм, конечно, полный. Есть ли какие соображения по этому поводу?
В таком виде (ниже) запрос вроде выполняется, но я жду уже более 20 мин и результата пока нет (кстати, в каждой таблице порядка 60-70 тыс. записей):
select * from t$bundles
where left(t$bundles.f$bbarkod, 30) not in
(select left(t$bundlesbak.f$bbarkod, 30) bbarkod from t$bundlesbak)


roottim   (2002-03-12 08:43:00) [5]

2JibSkeart
> Просто в первом случае
> выводится все поля из первай таблички + одно поле из второй
это ты про свои случаи?

а если см авторские... то должно все работать
никакого + поле из второй - там нет...

вариант автору: накидать для эксперимента 2 одинаковые табл.. забить их должнгым образом, и проверить ваши скл запросы... выполнены они вполне грамотно


JibSkeart   (2002-03-11 19:02:00) [6]

Да нет ошибки ни в том ни в другом случае нету

Просто в первом случае
выводится все поля из первай таблички + одно поле из второй

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

Вот и все !


aus   (2002-03-11 18:56:00) [7]

Не понятно, чем не верен твой первый запрос, вроде все правильно, в чем ты видишь ошибку?


JibSkeart   (2002-03-11 18:50:00) [8]

Ну может быть вам нужно было так ???

select A.* From t$bundles A,t$bundlesbak B
where B.f$bbarkod = A.f$bbarkod

Дело в том что вопрос не очень Понятен !!!


roottim   (2002-03-11 15:02:00) [9]

а может верен?
по скл в пр все нормально!...


Shoo   (2002-03-11 14:50:00) [10]

2JibSkeart:
Прошу прощения за задержку с ответом.
Если я правильно понял, твой запрос возвращает данные, которые есть в обоих таблицах, а мне нужны те, которые есть в первой, но нет во второй.


JibSkeart   (2002-03-11 12:38:00) [11]

SELECT A.*,B.MyField FROM Table1 a,Table2 b

а на твоем примере будет так

select A.*,B.f$bbarkod From t$bundles A,t$bundlesbak B
where B.f$bbarkod = A.f$bbarkod


Попробуй !!




deleon   (2002-03-11 12:36:00) [12]

А по структуре таблицы идентичны ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо