powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как сделать выборку из таблицы?
25 сообщений из 57, страница 2 из 3
Как сделать выборку из таблицы?
    #32497003
Фотография dalai lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, дядя, ухажу! Но не забывайте про тех, за чей счет вы такой крутой дядя здесь!

...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32497021
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DnicoFROM TABLE1 B1
JOIN TABLE1 B2 ON
Уточните пожалуйста, что Вы понимаете под B1 и B2 ?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32497030
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЭТо алиасы таблиц ... есть такая приблуда ...
чтобы не указывать длинное название таблицы
Best regards,
Dnico.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32497036
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под B1 и B2 он понимает алиасы таблиц.
В данном конкретном случае имеет место быть сомообъединение таблицы.
Т.е. соединение с самой собой.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32497119
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dnico & Мимопроходящий
Как я уже говорил, пои познания SQL близки к нулевым, поэтому не обезсудьте, хочу разобраться:

реальная таблица связана с компонентом taSklad : TpFIBDataSet;
из нее с помощью обсуждаемого SELECT формируется "виртуальная" таблица taSkladV : TpFIBDataSet;
которая лежит на той же форме (скажем ее имя "Form")что и реальная и связана с видимым компонентом DGCL_Compare : TdxDBGrid;


SELECT я пишу прямо в инспекторе обьектов в свойстве обьекта TpFIBDataSet или потом в процессе выполнения программы через свойство:

Form.taSkladV.selectSQL[0]:='SELECT Sklad.*,CART.*
Form.taSkladV.selectSQL[1]:='FROM Sklad left outer join CART on(Sklad.КодТовара=CART.CODE)';
Form.taSkladV.selectSQL[2]:='WHERE C_OSTAT>0 ... здесь проблема !


таблица CART, с которой выполняется join - просто картотека (КОД товара : Наименование товара), в первом

приближении этот join можно и не делать, чтоб не смущал,


Собственно вопрос Dnico что мне делать с алиасами В1 и В2? если я напишу

Var A,B : String;
....
A:=какой-то склад;
В:=какой-то другой склад;
...

Form.taSkladV.close;
Form.taSkladV.selectSQL[0]:='SELECT Sklad.*
Form.taSkladV.selectSQL[1]:='FROM Sklad B1 JOIN Sklad B2 ON (B1.TOVAR_CODE = B2.TOVAR_CODE)';
Form.taSkladV.selectSQL[2]:='WHERE B1.SKLAD_CODE='+A+' AND B2.SKLAD_CODE='+B+' AND B1.C_OSTAT=0';
Form.taSkladV.open;

разве InterBase не облает меня нехорошими словами при попытке выполнить такой Select?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32497807
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSB777таблица CART, с которой выполняется join - просто картотека (КОД товара : Наименование товара)
Сразу нельзя было сказать???
Попробуй следующие варианты.
1-й вариант:
Код: plaintext
1.
2.
3.
4.
5.
SELECT *

FROM CART C 
INNER JOIN TABLE1 B1 ON (C.TOVAR_CODE=B1.TOVAR_CODE)
INNER JOIN TABLE1 B2 ON (C.TOVAR_CODE = B2.TOVAR_CODE)
WHERE B1.SKLAD_CODE = 'A' AND B2.SKLAD_CODE = 'B' AND B1.C_OSTAT >  0  AND B2.C_OSTAT =  0  


2-й вариант:
Код: plaintext
1.
2.
3.
4.
SELECT *
FROM CART C WHERE EXISTS (SELECT  1  FROM TABLE1 B1 WHERE
 C.TOVAR_CODE=B1.TOVAR_CODE AND B1.SKLAD_CODE = 'A'  AND B1.C_OSTAT >  0 ) AND
EXISTS (SELECT  1  FROM TABLE1 B2 WHERE B2.SKLAD_CODE = 'B' AND  B2.C_OSTAT =  0  )

В первом варианте ты можешь получить, например сумму остатков на складе A.
Во втором варианте получишь только список товаров.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498065
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreemanZAVСразу нельзя было сказать???
А что о ней говорить? эта таблица вообще вспомогательная, без нее пока можно обойтись, в ней просто коду товара поставлено в соответствие его название (товар это книги соответственно название товара есть название книги).
Попробую еще раз уточнить проблему:
структура таблицы CKLAD такая:
Код: plaintext
1.
2.
3.
4.
5.
CODE -		код записи - Первичный ключ
СART_CODE -	код товара
SKLAD_CODE -	код склада
OSTAT -		количество товара с данным кодом на данном складе
.... -		прочие, не существенные в данный момент поля (разные цены и пр.)

структура таблицы CART такая:
Код: plaintext
1.
2.
3.
CODE - код записи - Первичный ключ 
NAME - назване товара
.... - прочие, не существенные в данный момент поля

для того чтобы сделать выборку мне НАЗВАНИЕ не нужно, название будет нужно когда я буду выводить выбранный список на экран для пользователя, тогда и делается join CART on(Sklad.СART_CODE=CART.CODE), т.е. в результирующую таблицу добавляется названиме товара (для оператора).

далее:

пример записей таблицы SKLAD
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CODE CART_CODE SKLAD_CODE OSTAT
 100 	 1 	 1 	 10 		
 101 	 1 	 2 	 5 
 102 	 1 	 3 	 0 		
 103 	 1 	 7 	 15 
 104 	 2 	 1 	 0 
 105 	 2 	 7 	 5 
 106 	 3 	 2 	 5 
 106 	 3 	 3 	 10 
 107 	 3 	 4 	 5 
 108 	 3 	 5 	 0 
.... и т.д. не на всех складах есть все виды товара, в смысле что для конкретного склада вобще может не быть записей с данным кодом товара или будет запись с кодом но количество будет нулевым. Задача состоит в том, чтобы для любых двух складов сделать выборку товара отсутсвующего на одном складе A (вообще обтсутвующего в принципе или имеющегося в количестве "0") и имеющегося в количестве большем "0" на другом складе B.

Алгоритм просматривается такой:
1. делаю выборку по складу А (все что на нем есть в количестве > 0), кажеться в IB это называется VIEWS
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Var 
Sklad: TpFIBDataSet; // реальная таблица из базы
Sklad2: TpFIBDataSet; // виртуальная таблица (VIEWS?)
Sklad3: TpFIBDataSet; // вспомогательная виртуальная таблица
// все компоненты лежат на одной форме Form1
...
// Формируем выборку по складу A условии  OSTAT> 0 , 
Form1.Sklad3.close;
Form1.Sklad3.selectSQL[ 0 ]:='SELECT Sklad.*;
Form1.Sklad3.selectSQL[1]:='FROM Sklad';
Form1.Sklad3.selectSQL[2]:='WHERE C_OSTAT> 0  AND SKLAD_CODE='+intToStr(Sklad_A_Num);
Form1.Sklad3.selectSQL[3]:='order by Sklad.CART_CODE'; // в принципе наверное не обязательно
Form1.Sklad3.open;

а дальше либо
2. делаю выборку по складу B (все что на нем есть в количестве > 0)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// Формируем выборку по складу B условии  OSTAT> 0 , 
Form1.Sklad2.close;
Form1.Sklad2.selectSQL[ 0 ]:='SELECT Sklad.*;
Form1.Sklad2.selectSQL[1]:='FROM Sklad';
Form1.Sklad2.selectSQL[2]:='WHERE C_OSTAT> 0  AND SKLAD_CODE='+intToStr(Sklad_B_Num);
Form1.Sklad2.selectSQL[3]:='order by Sklad.CART_CODE'; // в принципе наверное не обязательно
Form1.Sklad2.open;

3. исключаю из выборки B (Sklad2) все записи в которых встречается CART_CODE имеющийся в записях выборки A (Sklad3) просматривая для каждой записи из B список A, например так
Код: plaintext
1.
2.
3.
4.
5.
 while not Form1.Sklad2.EoF do
  begin
   if (в Sklad3 существует запись с CART_CODE равным CART_CODE текущей записи Sklad2) then (удалить текущую запись из Sklad2);
   Form1.Sklad2.Next;
  end;

но это конечно будет долго и нудно :(
либо
2. используя таблицу Sklad3 сразу формирую выборку Sklad2 с исключением записей в которых присутсвует CART_CODE имеющийся в записях Sklad3 организовав каконибудь хитрый SELECT.
Собственно это я и спрашивал в самом начале.

P.S. Испробовал вариант пердложеный самым первым
Kadrwhere (sklad_code=A) and (kod_tovar not in (select kod_tovar .... where sklad_code=B))
Код: plaintext
1.
2.
3.
4.
5.
6.
Form1.Sklad2.close;
Form1.Sklad2.selectSQL[ 0 ]:='SELECT Sklad.*;
Form1.Sklad2.selectSQL[1]:='FROM Sklad';
Form1.Sklad2.selectSQL[2]:='WHERE (SKLAD_CODE='+intToStr(Sklad_B_Num)+') AND (CART_CODE NOT'+
			   ' in (SELECT SKLAD_CODE FROM Sklad WHERE SKLAD_CODE='+intToStr(Sklad_A_Num)+'))';
Form1.Sklad2.selectSQL[3]:='order by Sklad.CART_CODE';

и раскритикованный Мимопроходящим, ну что-ж господин Мимопроходящий естественно прав, IB сервер загрузил систему на 99%, я честно ждал 15 минут, чайку попил, так и не дождался результата, пришлось прибить процесс.

P.P.S.
Что касается предложений FreemanZAV, то я немножко не понимаю логики запросов, в частности для варианта 2 получиться список товаров имеющихся на складах А и B, а нужно ведь не это, может надо
FreemanZAVSELECT *
FROM CART C WHERE EXISTS (SELECT 1 FROM TABLE1 B1 WHERE
C.TOVAR_CODE=B1.TOVAR_CODE AND B1.SKLAD_CODE = 'A' AND B1.C_OSTAT > 0) AND
NOT EXISTS (SELECT 1 FROM TABLE1 B2 WHERE B2.SKLAD_CODE = 'B' AND B2.C_OSTAT = 0 )
но так как в SQL я мягко говоря не силен, такая конструкция с точки зрения синтаксиса скорее всего не пройдет. Что касается алиасов, то я не знаю как их назначить (обьявить, прописать...), и что мне это даст.

В общем такие вот грабли :( господа, надеюсь на толковый совет.
С уважением Александр.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498180
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе нужен просто список товаров (как справочник) или записи из SKLAD?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498265
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто список товаров можно получить так.
1.Выборка из справочника:
Код: plaintext
1.
SELECT * 
FROM CART C

2. Условие
товара отсутсвующего на одном складе A (вообще обтсутвующего в принципе или имеющегося в количестве "0")
интерпретируем так:
Код: plaintext
1.
2.
(NOT EXISTS(SELECT  1  FROM Sklad S1 WHERE S1.SKLAD_CODE=A 
AND S1.TOVAR_CODE=C.TOVAR_CODE) OR EXISTS (SELECT  1  FROM Sklad S2 WHERE S2.SKLAD_CODE=A 
AND S2.TOVAR_CODE=C.TOVAR_CODE AND S2.C_OSTAT =  0 ) )

3.Условие и имеющегося в количестве большем "0" на другом складе B интерпретируем так:
Код: plaintext
EXISTS(SELECT  1  FROM  Sklad S3 WHERE  S3.TOVAR_CODE=C.TOVAR_CODE AND S3.SKLAD_CODE=B AND  S3.C_OSTAT> 0 )

4. Объединяем условия:
Код: plaintext
1.
2.
3.
4.
5.
SELECT * 
FROM CART C where (NOT EXISTS(SELECT  1  FROM Sklad S1 WHERE S1.SKLAD_CODE=A 
AND S1.TOVAR_CODE=C.TOVAR_CODE) OR EXISTS (SELECT  1  FROM Sklad S2 WHERE S2.SKLAD_CODE=A 
AND S2.TOVAR_CODE=C.TOVAR_CODE AND S2.C_OSTAT =  0 ) ) and EXISTS(SELECT  1  FROM  Sklad S3 WHERE  S3.TOVAR_CODE=
C.TOVAR_CODE AND S3.SKLAD_CODE=B AND  S3.C_OSTAT> 0 )

Если этот запрос устраивает, то далее могу рассказать, как на его основе получить записи из Sklad
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498389
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreemanZAVТебе нужен просто список товаров (как справочник) или записи из SKLAD?
Нужны записи из SKLAD, дополненные названием товара
Код: plaintext
... left outer join CART on(Sklad.CART_CODE=CART.CODE)'


Правильно ли я понял, что в конструкции
Код: plaintext
(NOT EXISTS(SELECT  1  FROM Sklad S1 WHERE S1.SKLAD_CODE=A 

единичка 1 это
Код: plaintext
1.
2.
SELECT * 
FROM CART C


и еще вопрос, я использую компонет TpFIBDataSet, как мне в нем назначить alias?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498490
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единицу в SELECT я пишу только для того, чтобы было меньще запросов к системным таблицам о структуре полей (в MS-SQL так было).

Код: plaintext
left outer join CART on(Sklad.CART_CODE=CART.CODE)

Если у тебя CART - справочник, то left делать не надо. А способ, который я показал основан именно на том, что в CART есть ВСЕ CART_CODE, которые присутствуют в Sklad. Not in, равно как и not Exists работают медленно из-за того, что в основном запросе (в данном случае Sklad) много записей, но если делать основную выборку из справочника, то скорость весьма приемлема (попробуй). Кстати вот еще вариант:
Код: plaintext
1.
2.
SELECT * FROM CART S LEFT JOIN Sklad  S ON (S.TOVAR_CODE=C.TOVAR_CODE
AND S.SKLAD_CODE=A  ) WHERE S.SKLAD_CODE IS NULL AND 
((S.SKLAD_CODE=A AND S.C_OSTAT= 0 ) OR (S.SKLAD_CODE=B AND S.C_OSTAT> 0 ))

Но опять же если в CART есть ВСЕ CART_CODE, которые присутствуют в Sklad. В это случае убиваешь двух зайцев получешь выборку и наименование.
Насчет alias непонятно.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498595
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСобственно вопрос Dnico что мне делать с алиасами В1 и В2? если я напишу
По поводу использования Алиасов таблиц:
Это просо упрощает написание длинных запросов. Вот например :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
В оригинале:
SELECT EMPLOYEE.ID, EMPLOYEE.FIRST_NAME, ORDERS.ID, ORDERS.AMOUNT FROM EMPLOYEE, ORDERS
WHERE EMPLOYEE.DEP_NO IN ( 1 , 2 , 3 , 4 , 5 )

или с использованием Алиасов, чтобы не писать длинные имена таблиц (компактнее):

SELECT T1.ID, T1.FIRST_NAME, T2.ID, T2.AMOUNT FROM EMPLOYEE T1, ORDERS T2 
WHERE T1.DEP_NO IN ( 1 , 2 , 3 , 4 , 5 )


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498634
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreemanZAVЕсли у тебя CART - справочник
1. CART действительно справочник, и вней есть ВСЕ коды товаров, даже больше чем нужно (записи 2-х ... 3-х летней давности, для которых С_OSTATOK точно будет равен 0)
2. Все же нужны записи из CKLAD с количеством и ценой, а в картотеке только названия :(
3. Насчет алиасов, вы пишете
Код: plaintext
1.
2.
3.
SELECT * FROM CART S LEFT JOIN Sklad  S ON (S.TOVAR_CODE=C.TOVAR_CODE
AND S.SKLAD_CODE=A  ) WHERE S.SKLAD_CODE IS NULL AND 
((S.SKLAD_CODE=A AND S.C_OSTAT= 0 ) OR (S.SKLAD_CODE=B AND S.C_OSTAT> 0 ))

Как я понял из разьяснений ...
DnicoЭТо алиасы таблиц ... есть такая приблуда ...
чтобы не указывать длинное название таблицы

МимопроходящийПод B1 и B2 он понимает алиасы таблиц.
В данном конкретном случае имеет место быть сомообъединение таблицы.
Т.е. соединение с самой собой.
... ваше S и есть алиас таблицы CART и в этой же строке для таблицы Sklad (почему один символ для разных таблиц? это описка? раньше вы писали S1, S2 и S3)
так вот мне и непонятно с точки зрения синтаксиса команды SELECT, что просто через пробел после имени таблицы пишется ее алиас (псевдоним) и потом им можно пользоваться в качестве имени?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498646
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока писал вопрос, на него уже ответили
Dnico - I thank you very much!
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498647
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S и есть алиас таблицы CART
Ошибся, надо C

так вот мне и непонятно с точки зрения синтаксиса команды SELECT, что просто через пробел после имени таблицы пишется ее алиас (псевдоним) и потом им можно пользоваться в качестве имени?
Точно. Можно еще и так
Код: plaintext
SELECT * FROM CART AS С 
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498673
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так вот, как раз и низзззя.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498684
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняйте, это только для полей:
Код: plaintext
SELECT CODE AS C FROM CART

С туевой хучей СУБД приходиться иметь дело, путается, что и где.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498792
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь за назойливость, но я Вас ловлю на слове
FreemanZAVдалее могу рассказать, как на его основе получить записи из Sklad
Все таки списка маловато, все же нужны записи из CKLAD с количеством и ценой, а в картотеке только названия :(
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498856
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вариант с LEFT JOIN не устраивает?
Кстати можно на ты, я не такой-уж старый
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498962
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreemanZAVА вариант с LEFT JOIN не устраивает?
в смысле к записям из картотеки подключать записи из соответствующего склада? Надо попробывать. Это так?
Код: plaintext
1.
2.
SELECT * FROM CART S LEFT JOIN Sklad  S ON (S.TOVAR_CODE=C.TOVAR_CODE
AND S.SKLAD_CODE=A  ) WHERE S.SKLAD_CODE IS NULL AND 
((S.SKLAD_CODE=A AND S.C_OSTAT= 0 ) OR (S.SKLAD_CODE=B AND S.C_OSTAT> 0 ))

Но тут может возникнуть одна проблемка, на даном складе модет быть несколько записей с одним и тем-же CART_CODE но с разными ценами, так уж исторически сложилось, что таблица CKLAD первична а картотека вторична.
P.S. Насчет ТЫ или ВЫ пожалуйста, просто человека не видно, кто то обижается на фамильярность, кто то нет, я лично не обижаюсь, хоть чайником назови, главное найти ответ на вопрос
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32498978
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, на сегодня INET кончается, попаду сюда только завтра утром :(
может к завтрашнему утру тут почвиться чтонибудь новенькое
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32499789
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение предложеное FreemanZAV
Код: plaintext
1.
2.
3.
4.
5.
SELECT * 
FROM CART C    
WHERE (NOT EXISTS(SELECT  1  FROM Sklad S1 WHERE S1.SKLAD_CODE=A AND S1.TOVAR_CODE=C.TOVAR_CODE) OR 
EXISTS (SELECT  1  FROM Sklad S2 WHERE S2.SKLAD_CODE=A AND S2.TOVAR_CODE=C.TOVAR_CODE AND S2.C_OSTAT =  0 )) AND 
EXISTS(SELECT  1  FROM  Sklad S3 WHERE  S3.TOVAR_CODE=C.TOVAR_CODE AND S3.SKLAD_CODE=B AND  S3.C_OSTAT> 0 )

работает, и даже вполне быстро, но УВЫ, нет информации о номере склада и количестве товара, а пользователю для анализа нужно как раз видеть количество товара и его цены на "большем" складе (условно считаем склад на котором данного товара нет "меньшим" а на котором есть "большим")

Попытка получить информацию из таблицы Sklad модифицировав предыдущее:
Код: plaintext
1.
2.
3.
SELECT C.*,S.SKLAD_CODE, S.C_OSTAT
FROM CART C LEFT JOIN Sklad S ON (S.CART_CODE=C.CODE AND S.SKLAD_CODE=B)
WHERE ...

ничего не дала :(
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32499842
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага. C left join фигня получается. Запарил блин. Вот тебе запрос, как обещал
(только последний Exists я заменил на INNER JOIN):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * 

FROM CART C  INNER JOIN Sklad S3 ON  S3.TOVAR_CODE=C.TOVAR_CODE  

WHERE (NOT EXISTS(SELECT  1  FROM Sklad S1 WHERE S1.SKLAD_CODE=A AND S1.TOVAR_CODE=C.TOVAR_CODE) OR 

EXISTS (SELECT  1  FROM Sklad S2 WHERE S2.SKLAD_CODE=A AND S2.TOVAR_CODE=C.TOVAR_CODE AND S2.C_OSTAT =  0 )) AND 
S3.SKLAD_CODE=B AND  S3.C_OSTAT> 0 

 /*EXISTS(SELECT 1 FROM  Sklad S3 WHERE  S3.TOVAR_CODE=C.TOVAR_CODE AND S3.SKLAD_CODE=B AND  S3.C_OSTAT>0)*/  

У меня на 400000 записей работало довольно быстро. Но конечно должны быть соотв. индексы. Если будут тормоза, то попробуй так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * 

FROM CART C  INNER JOIN Sklad S3 ON  S3.TOVAR_CODE= 0 +C.TOVAR_CODE  

WHERE (NOT EXISTS(SELECT  1  FROM Sklad S1 WHERE S1.SKLAD_CODE=A AND S1.TOVAR_CODE=C.TOVAR_CODE) OR 

EXISTS (SELECT  1  FROM Sklad S2 WHERE S2.SKLAD_CODE=A AND S2.TOVAR_CODE=C.TOVAR_CODE AND S2.C_OSTAT =  0 )) AND 
S3.SKLAD_CODE=B AND  S3.C_OSTAT> 0 

 /*EXISTS(SELECT 1 FROM  Sklad S3 WHERE  S3.TOVAR_CODE=C.TOVAR_CODE AND S3.SKLAD_CODE=B AND  S3.C_OSTAT>0)*/  

Или так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * 

FROM CART C  INNER JOIN Sklad S3 ON   0 +S3.TOVAR_CODE=C.TOVAR_CODE  

WHERE (NOT EXISTS(SELECT  1  FROM Sklad S1 WHERE S1.SKLAD_CODE=A AND S1.TOVAR_CODE=C.TOVAR_CODE) OR 

EXISTS (SELECT  1  FROM Sklad S2 WHERE S2.SKLAD_CODE=A AND S2.TOVAR_CODE=C.TOVAR_CODE AND S2.C_OSTAT =  0 )) AND 
S3.SKLAD_CODE=B AND  S3.C_OSTAT> 0 

 /*EXISTS(SELECT 1 FROM  Sklad S3 WHERE  S3.TOVAR_CODE=C.TOVAR_CODE AND S3.SKLAD_CODE=B AND  S3.C_OSTAT>0)*/  
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32499881
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное и так можно (проверь, мне некогда):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * 

FROM CART C  INNER JOIN Sklad S3 ON   0 +S3.TOVAR_CODE=C.TOVAR_CODE  

WHERE  ( NOT EXISTS(SELECT  1  FROM Sklad S1 WHERE S1.SKLAD_CODE=A AND S1.TOVAR_CODE=C.TOVAR_CODE)
or (S3.SKLAD_CODE=A AND  S3.C_OSTAT= 0 ))  /*OR 

EXISTS (SELECT 1 FROM Sklad S2 WHERE S2.SKLAD_CODE=A AND S2.TOVAR_CODE=C.TOVAR_CODE AND S2.C_OSTAT = 0)) */  AND 

(S3.SKLAD_CODE=B AND  S3.C_OSTAT> 0 ) 
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32499909
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз спасибо, к сожалению проверить смогу только вечером (там где есть Internet нет возможности работать с программой, а где есть возможность работать с программой нет интернета
)
Сразу же задам вопрос, может наивный...
Чтобы в выборке иметь поля из таблицы Sklad достаточно ли модифицировать Select:
Код: plaintext
1.
2.
3.
SELECT С,*,S3.CKLAD_CODE,S3.C_OSTAT 
или к примеру даже так:
SELECT С,*,S3.* 
или нужно еще что-то?
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как сделать выборку из таблицы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]