Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Delphi & SQL

3.2K
03 февраля 2004 года
kolyaka
22 / / 05.11.2003
Можно ли в Delphi скомбинировать запросы таким образом, что будут возвращаться те строки из первого запроса, которых нет аналогов во втором запросе. Команда Except(MINUS) не работает.
Заранее благодарен!
348
04 февраля 2004 года
Saris
389 / / 14.03.2003
Цитата:
Originally posted by kolyaka
Можно ли в Delphi скомбинировать запросы таким образом, что будут возвращаться те строки из первого запроса, которых нет аналогов во втором запросе. Команда Except(MINUS) не работает.
Заранее благодарен!


Если я правильно понял вопрос то вот:
select * from tab1 where not field1 in(select field1 from tab2);

3.2K
05 февраля 2004 года
kolyaka
22 / / 05.11.2003
Цитата:
Originally posted by Saris

Если я правильно понял вопрос то вот:
select * from tab1 where not field1 in(select field1 from tab2);



А если сравнивать записи с парой столбцов?
Kod_pred,Data

348
06 февраля 2004 года
Saris
389 / / 14.03.2003
Цитата:
Originally posted by kolyaka


А если сравнивать записи с парой столбцов?
Kod_pred,Data


Можно так:
select * from tab1 where (not field1 in(select Kod_pred from tab2))and(not field2 in(select Data from tab2));

3.2K
09 февраля 2004 года
kolyaka
22 / / 05.11.2003
Цитата:
Originally posted by Saris

Можно так:
select * from tab1 where (not field1 in(select Kod_pred from tab2))and(not field2 in(select Data from tab2));



Условие такое: если код не совпал то выводим, если код совпал но даты не совпали то тоже выводим

Я написал так:
SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
INNER JOIN "pribub.DBF" Pribub ON (Balance.KOD_PRED = Pribub.KOD_PRED)
AND (Balance.DATA = Pribub.DATA)
where Balance.KOD_PRED not in(select kod_pred
from fin_det_pred where data in (select Data from Balance))

Правильно?

348
10 февраля 2004 года
Saris
389 / / 14.03.2003
Цитата:
Originally posted by kolyaka


Условие такое: если код не совпал то выводим, если код совпал но даты не совпали то тоже выводим

Я написал так:
SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
INNER JOIN "pribub.DBF" Pribub ON (Balance.KOD_PRED = Pribub.KOD_PRED)
AND (Balance.DATA = Pribub.DATA)
where Balance.KOD_PRED not in(select kod_pred
from fin_det_pred where data in (select Data from Balance))

Правильно?



Странный вопрос. Потести и узнаешь. Поизвращался ты конечно порядочно. Если тебе нужно чтобы выводилось при невыполнении хотябы одного условия,
то можно так:
select * from tab1 where (not field1 in(select Kod_pred from tab2))or(not field2 in(select Data from tab2));

6.1K
10 февраля 2004 года
PeterV
13 / / 28.01.2004
Цитата:
Originally posted by kolyaka


Условие такое: если код не совпал то выводим, если код совпал но даты не совпали то тоже выводим

Я написал так:
SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
INNER JOIN "pribub.DBF" Pribub ON (Balance.KOD_PRED = Pribub.KOD_PRED)
AND (Balance.DATA = Pribub.DATA)
where Balance.KOD_PRED not in(select kod_pred
from fin_det_pred where data in (select Data from Balance))

Правильно?



Скорей всего нет. Например не закрываеш
where Balance.KOD_PRED not in(select kod_pred
from fin_det_pred

SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
WHERE Balance.KOD_PRED not in (select distinct kod_pred from fin_det_pred)
OR Balance.DATA not in (выбрать DISTINCT DATA из нужной таблицы)

3.2K
10 февраля 2004 года
kolyaka
22 / / 05.11.2003
Цитата:
Originally posted by PeterV


Скорей всего нет. Например не закрываеш
where Balance.KOD_PRED not in(select kod_pred
from fin_det_pred

SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
WHERE Balance.KOD_PRED not in (select distinct kod_pred from fin_det_pred)
OR Balance.DATA not in (выбрать DISTINCT DATA из нужной таблицы)



Не работает,мне надо сравнивать записи двух таблиц, а тут сравнивается сначала код а потом дата,в которых содержатся код и дата. Фактически это результат работы команды Except, но в BDE она не работает.
Пытаюсь делать так:
SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
INNER JOIN "pribub.DBF" Pribub ON (Balance.KOD_PRED = Pribub.KOD_PRED)
AND (Balance.DATA = Pribub.DATA)
where Balance.KOD_PRED not in(select Distinct kod_pred from fin_det_pred where fin_det_pred.data=Balance.Data)
or Balance.Data not in(select Distinct data
from fin_det_pred where fin_det_pred.kod_pred=Balance.kod_pred)

Работает, но очень долго!
Помогите!

3.2K
10 февраля 2004 года
kolyaka
22 / / 05.11.2003
Цитата:
Originally posted by Saris


Странный вопрос. Потести и узнаешь. Поизвращался ты конечно порядочно. Если тебе нужно чтобы выводилось при невыполнении хотябы одного условия,
то можно так:
select * from tab1 where (not field1 in(select Kod_pred from tab2))or(not field2 in(select Data from tab2));



Подскажи, почему команда Except не работает в BDE? И как мне ее заменить. Надо сравнивать записи двух таблиц.

6.1K
11 февраля 2004 года
PeterV
13 / / 28.01.2004
Цитата:
Originally posted by kolyaka


Подскажи, почему команда Except не работает в BDE? И как мне ее заменить. Надо сравнивать записи двух таблиц.



Какое это имеет значение? Главное, что не работает.:)

Не попробуешь

SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
WHERE Balance.KOD_PRED<>fin_det_pred.Kod
OR Balance.DATA<>fin_det_pred.Data

Если это не даст декартовое пересечение(?), то
теоретически должно работать.

6.1K
11 февраля 2004 года
PeterV
13 / / 28.01.2004
Цитата:
Originally posted by PeterV


Какое это имеет значение? Главное, что не работает.:)

Не попробуешь

SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
WHERE Balance.KOD_PRED<>fin_det_pred.Kod
OR Balance.DATA<>fin_det_pred.Data

Если это не даст декартовое пересечение(?), то
теоретически должно работать.



Сторно. Предполагаю, что запрос выберет все записи. Если бы ты добавил Primary key NDX к
таблице, тогда можно бы сделать

SELECT kod, data from balance where ndx not in
(SELECT ndx FROM fin_det_pred WHERE
fin_det_pred.kod=balance.kod and
fin_det_pred.data=balance.data)

3.2K
12 февраля 2004 года
kolyaka
22 / / 05.11.2003
Цитата:
Originally posted by PeterV


Сторно. Предполагаю, что запрос выберет все записи. Если бы ты добавил Primary key NDX к
таблице, тогда можно бы сделать

SELECT kod, data from balance where ndx not in
(SELECT ndx FROM fin_det_pred WHERE
fin_det_pred.kod=balance.kod and
fin_det_pred.data=balance.data)



Я не могу добавить ключ(да и куда код не уникален), пробовал подключать ID(ставил его счетчиком и ключом) но не помогает.
Твоей вариант я пробовал уже только, не понятен параметр ndx, запрос ругается. Вместо него я подставлял kod_pred и все работает, но только очень,очень долго поскольку сравнивается и код и дата.

3.2K
12 февраля 2004 года
kolyaka
22 / / 05.11.2003
Цитата:
Originally posted by PeterV


Какое это имеет значение? Главное, что не работает.:)

Не попробуешь

SELECT Distinct Balance.KOD_PRED, Balance.DATA FROM "balance.DBF" Balance
WHERE Balance.KOD_PRED<>fin_det_pred.Kod
OR Balance.DATA<>fin_det_pred.Data

Если это не даст декартовое пересечение(?), то
теоретически должно работать.



Теоритически это уже декартовое пересечение, а вот можно вообще создавать таблицу без уникального ключа, вот у меня такой вариант: нет ключа, а запись с кодом и датой надо сравнить с другим кодом и датой, может я не правильно сделал таблицу. Скорей всего здесь нужно поле, которое будет уникальным для каждой записи(Например конкатенация полей даты и кода)? Может так сделать?

6.1K
12 февраля 2004 года
PeterV
13 / / 28.01.2004
Цитата:
Originally posted by kolyaka


Теоритически это уже декартовое пересечение, а вот можно вообще создавать таблицу без уникального ключа, вот у меня такой вариант: нет ключа, а запись с кодом и датой надо сравнить с другим кодом и датой, может я не правильно сделал таблицу. Скорей всего здесь нужно поле, которое будет уникальным для каждой записи(Например конкатенация полей даты и кода)? Может так сделать?



Добавь одно поле в fin_det_pred например FLAG типа BOOLEAN и в OnNewRecord присвоить ему False
.

Потом
UPDATE fin_det_pred
SET flag=.T.
WHERE flag=.F. AND fin_det_pred.kod=balance.kod AND
fin_det_pred.data=balance.data
После этого нужно выбрать только то, где
flag = .F.
Долго работает, скорей всего из-за того, что
таблицы не индексированы. Если єто так, то нужен бы индекс по двум полям по kod и data.

Если не пользоваться командой Pack, то для уникального значения лучше подошло бы RecNo().

302
26 февраля 2004 года
Sagittarius
648 / / 12.04.2003
Цитата:
Originally posted by kolyaka
Можно ли в Delphi скомбинировать запросы таким образом, что будут возвращаться те строки из первого запроса, которых нет аналогов во втором запросе. Команда Except(MINUS) не работает.
Заранее благодарен!



Что вы мучаетесь?
Используй такой запрос:

select field1 as f1, field2 as f2 from table1
union
select field3 as f1, field4 as f2 from table2

Сервер сам всё сделает.

3.2K
18 марта 2004 года
kolyaka
22 / / 05.11.2003
Цитата:
Originally posted by PeterV


Добавь одно поле в fin_det_pred например FLAG типа BOOLEAN и в OnNewRecord присвоить ему False
.

Потом
UPDATE fin_det_pred
SET flag=.T.
WHERE flag=.F. AND fin_det_pred.kod=balance.kod AND
fin_det_pred.data=balance.data
После этого нужно выбрать только то, где
flag = .F.
Долго работает, скорей всего из-за того, что
таблицы не индексированы. Если єто так, то нужен бы индекс по двум полям по kod и data.

Если не пользоваться командой Pack, то для уникального значения лучше подошло бы RecNo().




Вс есводилось к тому, что надо было сделать уникальными два поля deta & kod_pred

302
18 марта 2004 года
Sagittarius
648 / / 12.04.2003
Мдя. Пожалуй конкатенация - одно из решений проблемы, но не самое лучшее. Наверняка есть цивильный способ, кто знает, киньте.

Вот решение конкатенацией:
select f1,f2 from tbl1
where cast(f1 as varchar(100))+cast(f2 as varchar(100)) not in (select cast(f1 as varchar(100))+cast(f2 as varchar(100)) from tbl2)

Хотя ты этот запрос, наверное, уже и сам написал. ))
6.1K
18 марта 2004 года
PeterV
13 / / 28.01.2004
Цитата:
Originally posted by kolyaka



Вс есводилось к тому, что надо было сделать уникальными два поля deta & kod_pred



Если хорошо помню (это было не вчера) поле flag я предлагал чтоб сделать запрос быстрее. Если имеется конкретная запись в обоих таблицах, то это так и останется. Но если присвоить полю Flag значение true, то в следующих запросах будет для этой записи будет проверяться только это поле.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог