|
|
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 14:41:58 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
DnicoFROM TABLE1 B1 JOIN TABLE1 B2 ON Уточните пожалуйста, что Вы понимаете под B1 и B2 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 14:46:44 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
ЭТо алиасы таблиц ... есть такая приблуда ... чтобы не указывать длинное название таблицы Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 14:48:49 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Под B1 и B2 он понимает алиасы таблиц. В данном конкретном случае имеет место быть сомообъединение таблицы. Т.е. соединение с самой собой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 14:50:03 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 16:09:50 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
SSB777таблица CART, с которой выполняется join - просто картотека (КОД товара : Наименование товара) Сразу нельзя было сказать??? Попробуй следующие варианты. 1-й вариант: Код: plaintext 1. 2. 3. 4. 5. 2-й вариант: Код: plaintext 1. 2. 3. 4. В первом варианте ты можешь получить, например сумму остатков на складе A. Во втором варианте получишь только список товаров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 08:14:20 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
FreemanZAVСразу нельзя было сказать??? А что о ней говорить? эта таблица вообще вспомогательная, без нее пока можно обойтись, в ней просто коду товара поставлено в соответствие его название (товар это книги соответственно название товара есть название книги). Попробую еще раз уточнить проблему: структура таблицы CKLAD такая: Код: plaintext 1. 2. 3. 4. 5. структура таблицы CART такая: Код: plaintext 1. 2. 3. для того чтобы сделать выборку мне НАЗВАНИЕ не нужно, название будет нужно когда я буду выводить выбранный список на экран для пользователя, тогда и делается join CART on(Sklad.СART_CODE=CART.CODE), т.е. в результирующую таблицу добавляется названиме товара (для оператора). далее: пример записей таблицы SKLAD Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Алгоритм просматривается такой: 1. делаю выборку по складу А (все что на нем есть в количестве > 0), кажеться в IB это называется VIEWS Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. а дальше либо 2. делаю выборку по складу B (все что на нем есть в количестве > 0) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 3. исключаю из выборки B (Sklad2) все записи в которых встречается CART_CODE имеющийся в записях выборки A (Sklad3) просматривая для каждой записи из B список A, например так Код: plaintext 1. 2. 3. 4. 5. но это конечно будет долго и нудно :( либо 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. и раскритикованный Мимопроходящим, ну что-ж господин Мимопроходящий естественно прав, 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 я мягко говоря не силен, такая конструкция с точки зрения синтаксиса скорее всего не пройдет. Что касается алиасов, то я не знаю как их назначить (обьявить, прописать...), и что мне это даст. В общем такие вот грабли :( господа, надеюсь на толковый совет. С уважением Александр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 10:50:10 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Тебе нужен просто список товаров (как справочник) или записи из SKLAD? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 11:21:27 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Просто список товаров можно получить так. 1.Выборка из справочника: Код: plaintext 1. 2. Условие товара отсутсвующего на одном складе A (вообще обтсутвующего в принципе или имеющегося в количестве "0") интерпретируем так: Код: plaintext 1. 2. 3.Условие и имеющегося в количестве большем "0" на другом складе B интерпретируем так: Код: plaintext 4. Объединяем условия: Код: plaintext 1. 2. 3. 4. 5. Если этот запрос устраивает, то далее могу рассказать, как на его основе получить записи из Sklad ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 11:47:45 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
FreemanZAVТебе нужен просто список товаров (как справочник) или записи из SKLAD? Нужны записи из SKLAD, дополненные названием товара Код: plaintext Правильно ли я понял, что в конструкции Код: plaintext единичка 1 это Код: plaintext 1. 2. и еще вопрос, я использую компонет TpFIBDataSet, как мне в нем назначить alias? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 12:24:34 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Единицу в SELECT я пишу только для того, чтобы было меньще запросов к системным таблицам о структуре полей (в MS-SQL так было). Код: plaintext Если у тебя CART - справочник, то left делать не надо. А способ, который я показал основан именно на том, что в CART есть ВСЕ CART_CODE, которые присутствуют в Sklad. Not in, равно как и not Exists работают медленно из-за того, что в основном запросе (в данном случае Sklad) много записей, но если делать основную выборку из справочника, то скорость весьма приемлема (попробуй). Кстати вот еще вариант: Код: plaintext 1. 2. Но опять же если в CART есть ВСЕ CART_CODE, которые присутствуют в Sklad. В это случае убиваешь двух зайцев получешь выборку и наименование. Насчет alias непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 12:58:02 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
авторСобственно вопрос Dnico что мне делать с алиасами В1 и В2? если я напишу По поводу использования Алиасов таблиц: Это просо упрощает написание длинных запросов. Вот например : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 13:40:20 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
FreemanZAVЕсли у тебя CART - справочник 1. CART действительно справочник, и вней есть ВСЕ коды товаров, даже больше чем нужно (записи 2-х ... 3-х летней давности, для которых С_OSTATOK точно будет равен 0) 2. Все же нужны записи из CKLAD с количеством и ценой, а в картотеке только названия :( 3. Насчет алиасов, вы пишете Код: plaintext 1. 2. 3. Как я понял из разьяснений ... DnicoЭТо алиасы таблиц ... есть такая приблуда ... чтобы не указывать длинное название таблицы МимопроходящийПод B1 и B2 он понимает алиасы таблиц. В данном конкретном случае имеет место быть сомообъединение таблицы. Т.е. соединение с самой собой. ... ваше S и есть алиас таблицы CART и в этой же строке для таблицы Sklad (почему один символ для разных таблиц? это описка? раньше вы писали S1, S2 и S3) так вот мне и непонятно с точки зрения синтаксиса команды SELECT, что просто через пробел после имени таблицы пишется ее алиас (псевдоним) и потом им можно пользоваться в качестве имени? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 13:55:36 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Пока писал вопрос, на него уже ответили Dnico - I thank you very much! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 14:00:51 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
S и есть алиас таблицы CART Ошибся, надо C так вот мне и непонятно с точки зрения синтаксиса команды SELECT, что просто через пробел после имени таблицы пишется ее алиас (псевдоним) и потом им можно пользоваться в качестве имени? Точно. Можно еще и так Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 14:01:26 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Вот так вот, как раз и низзззя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 14:10:49 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Извиняйте, это только для полей: Код: plaintext С туевой хучей СУБД приходиться иметь дело, путается, что и где. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 14:14:50 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Извиняюсь за назойливость, но я Вас ловлю на слове FreemanZAVдалее могу рассказать, как на его основе получить записи из Sklad Все таки списка маловато, все же нужны записи из CKLAD с количеством и ценой, а в картотеке только названия :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 14:49:05 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
А вариант с LEFT JOIN не устраивает? Кстати можно на ты, я не такой-уж старый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 15:03:25 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
FreemanZAVА вариант с LEFT JOIN не устраивает? в смысле к записям из картотеки подключать записи из соответствующего склада? Надо попробывать. Это так? Код: plaintext 1. 2. Но тут может возникнуть одна проблемка, на даном складе модет быть несколько записей с одним и тем-же CART_CODE но с разными ценами, так уж исторически сложилось, что таблица CKLAD первична а картотека вторична. P.S. Насчет ТЫ или ВЫ пожалуйста, просто человека не видно, кто то обижается на фамильярность, кто то нет, я лично не обижаюсь, хоть чайником назови, главное найти ответ на вопрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 15:37:04 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Все, на сегодня INET кончается, попаду сюда только завтра утром :( может к завтрашнему утру тут почвиться чтонибудь новенькое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 15:41:30 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Решение предложеное FreemanZAV Код: plaintext 1. 2. 3. 4. 5. работает, и даже вполне быстро, но УВЫ, нет информации о номере склада и количестве товара, а пользователю для анализа нужно как раз видеть количество товара и его цены на "большем" складе (условно считаем склад на котором данного товара нет "меньшим" а на котором есть "большим") Попытка получить информацию из таблицы Sklad модифицировав предыдущее: Код: plaintext 1. 2. 3. ничего не дала :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2004, 09:35:24 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Ага. C left join фигня получается. Запарил блин. Вот тебе запрос, как обещал (только последний Exists я заменил на INNER JOIN): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. У меня на 400000 записей работало довольно быстро. Но конечно должны быть соотв. индексы. Если будут тормоза, то попробуй так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Или так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2004, 10:05:39 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Наверное и так можно (проверь, мне некогда): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2004, 10:18:46 |
|
||
|
Как сделать выборку из таблицы?
|
|||
|---|---|---|---|
|
#18+
Еще раз спасибо, к сожалению проверить смогу только вечером (там где есть Internet нет возможности работать с программой, а где есть возможность работать с программой нет интернета ) Сразу же задам вопрос, может наивный... Чтобы в выборке иметь поля из таблицы Sklad достаточно ли модифицировать Select: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2004, 10:28:27 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32498646&tid=1578731]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 404ms |

| 0 / 0 |
