Delphi & SQL
Заранее благодарен!
Можно ли в Delphi скомбинировать запросы таким образом, что будут возвращаться те строки из первого запроса, которых нет аналогов во втором запросе. Команда Except(MINUS) не работает.
Заранее благодарен!
Если я правильно понял вопрос то вот:
select * from tab1 where not field1 in(select field1 from tab2);
Если я правильно понял вопрос то вот:
select * from tab1 where not field1 in(select field1 from tab2);
А если сравнивать записи с парой столбцов?
Kod_pred,Data
А если сравнивать записи с парой столбцов?
Kod_pred,Data
Можно так:
select * from tab1 where (not field1 in(select Kod_pred from tab2))and(not field2 in(select Data from tab2));
Можно так:
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))
Правильно?
Условие такое: если код не совпал то выводим, если код совпал но даты не совпали то тоже выводим
Я написал так:
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));
Условие такое: если код не совпал то выводим, если код совпал но даты не совпали то тоже выводим
Я написал так:
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 из нужной таблицы)
Скорей всего нет. Например не закрываеш
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)
Работает, но очень долго!
Помогите!
Странный вопрос. Потести и узнаешь. Поизвращался ты конечно порядочно. Если тебе нужно чтобы выводилось при невыполнении хотябы одного условия,
то можно так:
select * from tab1 where (not field1 in(select Kod_pred from tab2))or(not field2 in(select Data from tab2));
Подскажи, почему команда Except не работает в BDE? И как мне ее заменить. Надо сравнивать записи двух таблиц.
Подскажи, почему команда 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
Если это не даст декартовое пересечение(?), то
теоретически должно работать.
Какое это имеет значение? Главное, что не работает.:)
Не попробуешь
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)
Сторно. Предполагаю, что запрос выберет все записи. Если бы ты добавил 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 и все работает, но только очень,очень долго поскольку сравнивается и код и дата.
Какое это имеет значение? Главное, что не работает.:)
Не попробуешь
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
Если это не даст декартовое пересечение(?), то
теоретически должно работать.
Теоритически это уже декартовое пересечение, а вот можно вообще создавать таблицу без уникального ключа, вот у меня такой вариант: нет ключа, а запись с кодом и датой надо сравнить с другим кодом и датой, может я не правильно сделал таблицу. Скорей всего здесь нужно поле, которое будет уникальным для каждой записи(Например конкатенация полей даты и кода)? Может так сделать?
Теоритически это уже декартовое пересечение, а вот можно вообще создавать таблицу без уникального ключа, вот у меня такой вариант: нет ключа, а запись с кодом и датой надо сравнить с другим кодом и датой, может я не правильно сделал таблицу. Скорей всего здесь нужно поле, которое будет уникальным для каждой записи(Например конкатенация полей даты и кода)? Может так сделать?
Добавь одно поле в 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().
Можно ли в Delphi скомбинировать запросы таким образом, что будут возвращаться те строки из первого запроса, которых нет аналогов во втором запросе. Команда Except(MINUS) не работает.
Заранее благодарен!
Что вы мучаетесь?
Используй такой запрос:
select field1 as f1, field2 as f2 from table1
union
select field3 as f1, field4 as f2 from table2
Сервер сам всё сделает.
Добавь одно поле в 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
Вот решение конкатенацией:
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)
Хотя ты этот запрос, наверное, уже и сам написал. ))
Вс есводилось к тому, что надо было сделать уникальными два поля deta & kod_pred
Если хорошо помню (это было не вчера) поле flag я предлагал чтоб сделать запрос быстрее. Если имеется конкретная запись в обоих таблицах, то это так и останется. Но если присвоить полю Flag значение true, то в следующих запросах будет для этой записи будет проверяться только это поле.