powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как сделать выборку из таблицы?
57 сообщений из 57, показаны все 3 страниц
Как сделать выборку из таблицы?
    #32496577
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые Господа, простая на первый взгляд задача оказалась весьма проблематичной.
Есть база (IB) и клиентская программа написанная на Delphi (FIB+).
В базе есть таблица примерно с такой условной структурой:

Код : Integer
Код_Склада : Integer
Код_Товара : Integer
Количество : Integer
.... и еще несколько полей, которые в данный момент не важны.

Данные по всем складам (число складов чуть болше 60) для всех категорий товара (больше 5000) хранятьтся в одной таблице, один и тотже товар (поле Код_Товара) имеется на нескольких разных складах (поле Код_склада) в разном количестве (поле Количество), может быть Количество=0.
Необходимо сделать выборку из таблицы для товара (Код_Товара) имеющегося на одном складе (условно большом) и отсутствующего на другом (условно малом).

IB и SQL я практически не знаю, с Delphi правда получше, поэтому первая мысль была такая: "Ну это просто..."

A - номер "большого" склада
В - номер "малого" склада
SELECT ...
WHERE SKLAD_CODE=А AND SKLAD_CODE<>B AND C_OSTAT>0;

примерно через полчаса я понял какую глупость написал и то, что одним Select не обойтись :(
В общем большая просьба к почтенной публике, помогите советом.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496651
Kadr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Select .....
where (sklad_code=A) and (kod_tovar not in (select kod_tovar .... where sklad_code=B))
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496757
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А потом долго биться головой об стенку, пока не запомнишь, что:
КОНСТРУКЦИЯ WHERE NOT IN (SELECT...) НЕЭФФЕКТИВНА !
(в силу архитектурных особенностей InterBase)
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496808
Фотография dalai lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему, Мимопроходящий умничает за наш, за ламерский, счет. "Неэффективна" - а как надо-то - не говорит!
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496817
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МОЖЕТ ТАК ?
Код: plaintext
1.
2.
3.
4.
SELECT *
FROM TABLE1 B1
JOIN TABLE1 B2 ON (B1.TOVAR_CODE = B2.TOVAR_CODE)
WHERE B1.SKLAD_CODE = 'A' AND B2.SKLAD_CODE = 'B' AND B2.C_OSTAT >  0 


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496823
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий - всегда отсылает к документации !!!
Его ответы можно даже не читать ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496856
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помимо документации я могу отсылать и сюда
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496860
Фотография dalai lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, вот пожалуемся на тебя модератору, что ты такой гад! Теперь не хочеться заходить на этот форум из-за тебя! Спросишь чтонибудь, а тебя накй пошлют
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496862
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сходил?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496865
Фотография dalai lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я на ПТ часто хожу, эту ссылку давно знаю! Сам иди туда!

...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496876
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSB777Необходимо сделать выборку из таблицы для товара (Код_Товара) имеющегося на одном складе (условно большом) и отсутствующего на другом (условно малом)...одним Select не обойтись
Ответ заключается в вопросе.
Вот один из вариантов (и весьма быстрый)
Код: plaintext
1.
2.
3.
4.
5.
SELECT ... 
WHERE SKLAD_CODE=А  AND C_OSTAT> 0 ; 
UNION ALL
SELECT ... 
WHERE
  SKLAD_CODE=B AND C_OSTAT= 0 
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496880
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На ПТ?
Нормальным пацанам тем делать нечего (почти)
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496888
Фотография dalai lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вижу нормальные пацаны типа тебя предпочитают трепаться и самоутверждаться на профессиональных форумах!
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496894
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2FreemanZAV:
Не, не катит. Ему нужно найти только тот товар , который есть на складе А и отсутсвует на складе В
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496895
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А че такое ПТ и как ставить смайлики в тексте?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496903
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2dalai lamer:
И кто начал?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496909
Фотография dalai lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не самоутверждался и не издевался над задающими вопросы! Я лишь поднял тему о твоем поведении!
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496914
Фотография dalai lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А все боятся меня поддержать, потому что ты грубо ответишь!

зы. где модератор??
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496918
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПТ - это тут
А смайлик на этом сайте только один (почему-то)
Рисуешь так:
Код: plaintext
:)))

Получается так -
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496933
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точняк. Не катит. Получается не И а ИЛИ.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496935
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите Господа, но Вы отвлеклись от темы :-)
Отдельно спасибо ответившим конструктивно , вечером буду пробовать, завтра смогу описать результат.
Опять же отдельно вопрос Мимопроходящему, а что значит
НЕЭФФЕКТИВНА? не работает? работает медленно? работает неправильно?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496952
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSB777
Я немного подумал и вот кажется самое то, что нужно
Код: plaintext
1.
2.
3.
4.
SELECT *
FROM TABLE1 B1
JOIN TABLE1 B2 ON (B1.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  



Best regards,
Dnico.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496958
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора что значит НЕЭФФЕКТИВНА?
Вот это уже другой разговор.
Дела в том, что IB при выполнении запроса типа WHERE ... [NOT] IN (SELECT...) не кеширует результаты подзапроса. И как следствие, этот запрос будет дёргаться каждый раз заново, для каждой записи фильтруемой таблицы. Как следствие, производительность такой конструкции очень низкая и её следует избегать.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496982
Фотография dalai lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Вот это уже другой разговор.

Это ты решил разжевать не потому что тебя "правильно" спросили, а потому что моя критика снизу на тебя подействовала!
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32496994
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2dalai lamer:
Мальчик, вернись в свой ПТ. У тебя ж там 68% постов. Не мешай дядям работать.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #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
Как сделать выборку из таблицы?
    #32499955
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Достаточно. Только синтаксис проверь. И почитай книги по SQL.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32500333
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreemanZAVИ почитай книги по SQL.
Книги это хорошо, только для начала надо учебник и желательно бы в электронном виде, может подскажешь пару ссылочек?
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32500668
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ibphoenix.com
ibase.ru
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32500730
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! нашел прямо на этом сайте в разделе "Документы"
Мартина Грабера "Понимание SQL" (Understanding SQL).
Отличная книга!
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32500744
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только перевод корявый и книга древняя. Про JOIN там ни слова.
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32500847
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to SSB777
Да сходи ты в магазин и купи любую книгу по SQL (200р. стоит нормальная книга)
...
Рейтинг: 0 / 0
Как сделать выборку из таблицы?
    #32501837
SSB777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз спасибо всем откликнувшимя
, даже тем кто не поделу.

Вариант 1 из ответа 653523 ( FreemanZAV ) на первый взгляд отлично работает (точно можно будет сказать через пару месяцев, когда пользователи
поработают), так что, в общем, тему можно считать исчерпаной.
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как сделать выборку из таблицы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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