Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.36.192] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Так и не решил проблему с сортировкой в запросе.
SELECT "Articul", "Price" FROM "catalog" WHERE "Articul" IN('111', '055', '5464', '54', '548'); У меня табличка на wxWidgets я в нее цены пишу, для этого приходится у бд запрашивать еще и артикул и потом программно рассортировывать. Сейчас, когда товаров почти 2к вопрос с сортировкой встал остро - грузится около минуты все это дело. Проблема в том что, MsSQL возвращает не в том порядке в котором я запрашивал, а в том, в котором находит в базе. Мне возвращаемые значения нужно записать в табличку под определенным номером ячейки. Данные для запроса я беру из этой же таблицы. Было бы супер легко все рассортировать если бы я мог в запрос передать номер ячейки вместе с артикулом, и MsSQL вернул бы мне цену вместе с этим номером, я бы просто обновил ячейку в таблице соответствующую номеру. Вместо этого мне приходится делать цикл - для каждого артикула пробегать всю таблицу и сравнивать. в итоге 2000*2000=4 милиона циклов, что очень печально. Можно ли так сделать? Как-нибудь по простому, чтобы базу не грузить слишком сложными конструкциями? Помогите пожалуйста. С меня лайки) |
Сообщ.
#2
,
|
|
|
Погодиии .... давай разберемся, не "стоя на голове" ...
Цитата TravNik @ Можно ли так сделать? Как-нибудь по простому, чтобы базу не грузить слишком сложными конструкциями? Смысл "клиент-серверной" архитектуры предполагает обратное - все запросы желательно исполнять именно на серваке. Клинет - только "отображатель". Цитата TravNik @ Сейчас, когда товаров почти 2к вопрос с сортировкой встал остро Верь мне - это "копейки". Даже меньше. Цитата TravNik @ Проблема в том что, MsSQL возвращает не в том порядке в котором я запрашивал, а в том, в котором находит в базе Ты лукавишь. Сервер всегда возвращает то, что и как запросили. Ты запрашивал неправильно. Цитата TravNik @ Вместо этого мне приходится делать цикл - для каждого артикула пробегать всю таблицу и сравнивать. в итоге 2000*2000=4 милиона циклов, что очень печально. Бла-бла-бла ... я твое повествование пропустил, сорри, и без обид - я действительно хочу помочь. А вот далее излагай суть своей задачи. Повторюсь - не так, как ты ее решал и у тебя не получилось!!! А ... какие исходные данные есть (без привязки к каким-то БД), какой результат обсчета ты хотел бы получить. Для упрощения этого вопроса - считай что ты не на программерском форуме, а на форуме филологов. Давай, сначала, спойкойно и подробно ... Мол " есть такие данные" а я хочу "рассчитать такие", условия обсчета "такие". |
Сообщ.
#3
,
|
|
|
man order by
|
Сообщ.
#4
,
|
|
|
Цитата JoeUser @ А вот далее излагай суть своей задачи Исходные данные таблица вида: № артикул товар Цена ___________________________________________ 1 114454 блаблабла ? 2 564646 блаблабла ? 3 654564 блаблабла ? Я в цикле прокручиваю всю таблицу. Записываю артикулы. Составляю запрос к бд вида: SELECT "Price" FROM "catalog" WHERE "Articul" IN('111', '055', '5464', '54', '548' ...) Мой_номер_ячейки IN (1, 2, 3 ...); Хотелось бы отправлять в запросе номер ячейки и получать ответ от базы типа: Мой_номер_ячейки 1, Цена 15100 Мой_номер_ячейки 2, Цена 20000 Мой_номер_ячейки 3, Цена 24564 Я получаю ответ от бд и Обновляю ячейки с соответствующим номером. Цитата JoeUser @ Ты лукавишь. Сервер всегда возвращает то, что и как запросили. Ты запрашивал неправильно. Я не лукавлю. Тот запрос который я привел возвращает именно так как товары идут в базе, а не так как я запрашивал. |
Сообщ.
#5
,
|
|
|
Цитата TravNik @ Исходные данные таблица вида: № артикул товар Цена ___________________________________________ 1 114454 блаблабла ? 2 564646 блаблабла ? 3 654564 блаблабла ? Где "цена"? Цитата TravNik @ Мой_номер_ячейки 1, Цена 15100 Каково "правило" расчета "номера ячейки"? |
Сообщ.
#6
,
|
|
|
|
Сообщ.
#7
,
|
|
|
Gonarh, тебе замечание - не юродствуй!
|
Сообщ.
#8
,
|
|
|
Цитата JoeUser @ Где "цена"? Да это таблица на wxWidgets которую я заполняю программно эта таблица (типа Excell таблицы) у меня на компе, мне ее нужно заполнить из бд сервера. Цены нет так как запрос еще не отправлен)) Товарищи, дабы не завязнуть в ненужной терминологии и не залезть в дебри спрошу проще: КАК ПОМЕТИТЬ ЗАПРОС???? Мне всего то нужно отправить МЕТКУ - чтобы БД на сервере вернула мне эту метку и я знал КУДА МНЕ ЗАПИСАТЬ ОТВЕТ, А ИМЕННО В КАКУЮ ЯЧЕЙКУ. Блин, ну как же проще то объяснить... Ну всего делов, чтобы запрос мне вернул то что я ему отправил. Отправил к примеру SELECT "Price" бла бла бла и передал номер ячейки А сервер мне вернул ответ с этим номером, чтобы я знал какую мне ячейку обновлять, чтобы избавится от ненужной сортировки... Если еще проще: 1) Я спрашиваю у БД - какая цена на этот артикул? Верни мне пожалуйста цену на этот артикул и циферку 1(так как в моей локальной таблице этот товар лежит в 1 ячейке) 2) БД возвращает мне ответ: Цена 20000, циферка 1 3) Я обновляю свою локальную таблицу - записываю в первую строку цену. ПРОФИТ. |
Сообщ.
#9
,
|
|
|
TravNik, еще раз ... Выкинь все мысли из головы. Выкинул? Осознай гипотизо-аксиому: "В правильно поставленном вопросе содержится 50% правильного ответа".
Нет таблиц, нет vxWigdets, ваще компа нед ... Есть ИСХОДНАЯ ИНФА, обозначим ее как "И". Есть ожидаемый тобой результат, обозначим его как "Р". И есть действие(функция) которая этот результат даст, обозначим ее "F". Итого, имеем: F(И) = Р Твоя задача: четко, ПОДЧЕРКИВАЮ, четко и детально обозначить все две составляющие "И" и "Р". Тогда, и только тогда, мы сможем осознать что должна "F", и найти ее реализацию!!! Цитата TravNik @ КАК ПОМЕТИТЬ ЗАПРОС???? Мне всего то нужно отправить МЕТКУ - чтобы БД на сервере вернула мне эту метку и я знал КУДА МНЕ ЗАПИСАТЬ ОТВЕТ, А ИМЕННО В КАКУЮ ЯЧЕЙКУ. Блин, ну как же проще то объяснить... Ну всего делов, чтобы запрос мне вернул то что я ему отправил. Какую метку, метку чего, метку куда, и метку откуда? Это риторический вопрос. Отвечать не нужно! Для "постороннего наблюдателя", нас, форумчан - это темная темнота. Поэтому, вернись к началу этого поста, почитай, и изложи системно. Там нужно всего лишь два важных параметра "есть" и "хочу получить". |
Сообщ.
#10
,
|
|
|
Цитата JoeUser @ Там нужно всего лишь два важных параметра "есть" и "хочу получить". Есть артикулы 432, 234, 23345, 65456, 546, 5464, и соответствующие им цифры - 1, 2, 5, 9, 4, 11 Хочу получить цену по этим артикулам и соответствующие артикулам цифры. Оправляю АРТИКУЛ и ЦИФРУ, получаю ЦЕНУ из таблицы и ЦИФРУ. |
Сообщ.
#11
,
|
|
|
Добавь в грид поле. Спрячь его. При загрузке данных запиши в него Aртикул. Используй ети данные в запросе какая цена продукта с етим артикулом.
|
Сообщ.
#12
,
|
|
|
Цитата MIF @ Добавь в грид поле. Спрячь его. При загрузке данных запиши в него Aртикул. Используй ети данные в запросе какая цена продукта с етим артикулом. Такое поле и так уже есть, притом не скрытое. И артикулы в это поле уже записаны и рассортированы так как надо. И данные эти я в запросе использую, и цену получаю. Проблема в том, что приходится полученные от БД данные сортировать, а вот если бы я мог послать вместе с артикулом номер ячейки грида и получить цену и номер ячейки - то можно было бы обойтись без сортировки. Но как передать удаленной БД номер ячейки, так чтобы он вернул цену с этим номером я не знаю. |
Сообщ.
#13
,
|
|
|
Цитата TravNik @ Есть артикулы 432, 234, 23345, 65456, 546, 5464, и соответствующие им цифры - 1, 2, 5, 9, 4, 11 Хочу получить цену по этим артикулам и соответствующие артикулам цифры. Оправляю АРТИКУЛ и ЦИФРУ, получаю ЦЕНУ из таблицы и ЦИФРУ. Давай-ка структуру своих таблиц. Ибо непонятен термин "соответствующя цифра". Цифра понятно, но "способ соответствия" каков? Это таблица соответствия или че? |
Сообщ.
#14
,
|
|
|
Цитата JoeUser @ Давай-ка структуру своих таблиц. |
Сообщ.
#15
,
|
|
|
Цитата JoeUser @ Сорри за флуд - чья б корова мычала ! Gonarh, тебе замечание - не юродствуй! |
Сообщ.
#16
,
|
|
|
TravNik чесслово, очень внимательно читал не понял ни одной буквы.
1. какую проблему решаем? Показать в интерфейсе артикулы и цены? Тогда почему спрашиваем по одному полю? Почему нельзя спросить все сразу? 2 артикулы приходят "снаружи" и надо заполнить грид полными данными? Ну так опять подход неверный. Не надо отдельно искать. Надо брать в БД весь набор данных и заполнять строку целиком. |
Сообщ.
#17
,
|
|
|
Цитата Павел Калугин @ Тогда почему спрашиваем по одному полю? SELECT "Articul", "Price" FROM "catalog" WHERE "Articul" IN('111', '055', '5464', '54', '548'); Вроде я сразу несколько полей запросил - артикулы и цены. Цитата Павел Калугин @ Показать в интерфейсе артикулы и цены? Верно. Как бы вы решили такую задачу? При условии, что цену нужно получить для конкретных артикулов которые грузятся из файла на компьютере, а не из БД. Файл с артикулами находится в папке с программой и они от туда подгружаются в программу - из БД их грузить нельзя, так как они в файле рассортированы вручную особым образом. |
Сообщ.
#18
,
|
|
|
Напиши хранимую процедуру с параметром типа xml. В параметре передай структуру типа
<rows> <row id=1 articul=123\> <row id=5 artikul=235\> <\rows> Сджойнишь ее с таблицей артикулов. Возвратишь рекордсет с артикулами, ценой и номерами строк в клиентском гриде. |
Сообщ.
#19
,
|
|
|
Цитата MIF @ Сджойнишь ее с таблицей артикулов. Возвратишь рекордсет с артикулами, ценой и номерами строк в клиентском гриде. Объясни пожалуйста подробнее. Я в MsSQL нуб, знаю пару базовых запросов... Это подразумевает правку таблицы на сервере? Если да, то не вариант, модификация серверной части запрещена политикой. |
Сообщ.
#20
,
|
|
|
TravNik, я вот согласен с Павлом:
Цитата Павел Калугин @ TravNik чесслово, очень внимательно читал не понял ни одной буквы. Твое "графическое" представление - по сути, опять непонятный вопрос. Структуру таблиц принято описывать используя DDL. Пример описания таблицы с именем "Phones": CREATE TABLE public."Phones" ( "Id" INTEGER DEFAULT nextval('"Phones_Id_seq1"'::regclass) NOT NULL, "Name" VARCHAR(20), "PhoneType" VARCHAR(20), "PhoneNum" VARCHAR(20), CONSTRAINT "Phones_pkey1" PRIMARY KEY("Id") ); Вот в таком виде я просил предоставить данные о таблицах БД, из которых ты собираешься извлекать информацию. Цитата TravNik @ При условии, что цену нужно получить для конкретных артикулов которые грузятся из файла на компьютере, а не из БД. Это всего лишь вопрос динамического формирования SQL-запроса. Иными словами, загрузив файл артикулов и их порядков, ты, на основе загруженного, формируешь запрос к БД, скармливаешь его серверу, ну и получаешь нужный ответ. Поэтому опубликуй структуру таблиц БД (не всех, а в которых есть интересующие данные), дальше будем смотреть, как строить нужный тебе запрос. |
Сообщ.
#22
,
|
|
|
Цитата JoeUser @ Вот в таком виде я просил предоставить данные о таблицах БД, из которых ты собираешься извлекать информацию. Локальная таблица: "PositonRow" INTEGER, "ArtNo" VARCHAR(50), "TovarName" VARCHAR(100), "Price" INTEGER; MSSQL: "OfferID" INTEGER, "ProductID" INTEGER, "Amount" FLOAT, "Price" FLOAT, "SupplyPrice" FLOAT, "ColorID" INTEGER, "SizeID" INTEGER, "ArtNo" VARCHAR(50); Помогите пожалуйста. MsSQL только начал изучать, сам не разберусь, ибо мои познания сейчас на уровне SELECT / UPDATE. |
Сообщ.
#23
,
|
|
|
Цитата TravNik @ Файл с артикулами находится в папке с программой и они от туда подгружаются в программу - из БД их грузить нельзя, так как они в файле рассортированы вручную особым образом. Отлично. Пусть, к примеру, есть локальный файл следующего содержимого: Артикул;Название ==================================== 31200;"Промтовары" 110;"Ювелирные издения" 4777;"Бытовая химия" Твоя задача - программно распарсить его и получить первую часть твоего будущего SQL-запроса. Должно получится следующее: WITH Art ("SortKey", "ArtNo", "ArtName") AS ( SELECT * FROM ( VALUES (1, 31200, 'Промтовары'), (2, 110, 'Ювелирные издения'), (3, 4777, 'Бытовая химия') ) AS L ) Конструкция WITH позволяет задать временно именованный результирующий набор. Его называют "Обобщенное табличное выражение". В данном случае - мы данные не берем из БД, а собираем "синтетически" в конструкции VALUES. Заметь, что цифры 1,2,3 - берутся просто как порядковые номера строк из того твоего файла. Они будут первым ключом сортировки. Попробуем составить окончательный запрос. WITH Art ("SortKey", "ArtNo", "ArtName") AS ( SELECT * FROM ( VALUES (1, 31200, 'Промтовары'), (2, 110, 'Ювелирные издения'), (3, 4777, 'Бытовая химия') ) AS L ) SELECT Art."ArtNo", Art."ArtName", T."Price" FROM Art LEFT JOIN "Table" AS T ON -- а вот тут уже "Table" - это имя реальной таблицы из твоей БД T."ArtNo" = Art."ArtNo" ORDER BY Art."SortKey", Art."ArtName" Собственно и все. В результате должно вернуться нечто, типа:" ArtNo ArtName Price =================================== 31200 "Промтовары" 1000 110 "Ювелирные издения" 700000 4777 "Бытовая химия" 500 ЗЫ: Единственное, где я не совсем понял - это как можно выставлять цену по артикулу? Возможно я "плаваю" в предмете. Но, насколько я понимаю, артикул - это код группы товаров. И если это так, то тогда нужно либо добавлять столбец "Наименование товара", либо по "артикулу" считать min, max, agv ... Иначе в таком виде, как я написал выше - запрос выдает бог-весть-что, хотя и клеится по "ArtNo". |
Сообщ.
#24
,
|
|
|
Цитата TravNik @ они в файле рассортированы вручную особым образом. В файле есть понятие порядка следования записей. Физического порядка. Однако для SQL-сервера понятия физического порядка не существует, для него существует только понятие порядка, определяемого выражением сортировки. Вывод - при получении информации из файла ты должен дополнить её неким дополнительным полем, при сортировке по которому порядок следования записей будет соответствовать физическому порядку записей в исходном файле. Вариант реализации такой операции показал JoeUser (ввёл дополнительное поле SortKey и заполнил его последовательными значениями). |
Сообщ.
#25
,
|
|
|
JoeUser, я немного изменил ваш код, вроде ошибок нет, но сервер ничего не возвращает...
WITH Art ("SortKey", "ArtNo") AS ( SELECT * FROM ( VALUES (0, '001459'), (1, '001078'), (2, '001190') ) AS L ) SELECT Art."SortKey", T."Price" FROM Art Left JOIN "Server"."Catalog"."Product" AS T ON T."ArtNo" = Art."ArtNo" ORDER BY Art."SortKey" Еще не понял что такое ") AS L" и почему эта L далее нигде не используется... |
Сообщ.
#26
,
|
|
|
Цитата TravNik @ JoeUser, я немного изменил ваш код, вроде ошибок нет, но сервер ничего не возвращает... Скорее всего проблема где-то в "склейке". Может быть в таблице БД поле "ArtNo" заполнено цифрами с концевыми (и/или начальными) пробелами. Если это так, то условие склейки надо модифицировать как-то так: WITH Art ("SortKey", "ArtNo") AS ( SELECT * FROM ( VALUES (0, '001459'), (1, '001078'), (2, '001190') ) AS L ) SELECT Art."SortKey", T."Price" FROM Art LEFT JOIN "Server"."Catalog"."Product" AS T ON LTRIM(RTRIM(T."ArtNo")) = Art."ArtNo" -- <--- тут надо смареть LTRIM RTRIM, я с MS SQL не работал ORDER BY Art."SortKey" Цитата TravNik @ Еще не понял что такое ") AS L" и почему эта L далее нигде не используется... Когда источник FROM - не таблица, а возвращаемый набор от какой-то конструкции или подзапроса, то синтаксис SQL требует именования такого селекта посредством AS, даже если нет явного использования его полей. Хотя лучче у Akin'ы спросить, возможно он ответит более грамотно. |
Сообщ.
#27
,
|
|
|
Цитата JoeUser @ "ArtNo" заполнено цифрами с концевыми (и/или начальными) пробелами Я проверял через админку, через HeidiSQL - пробелов нет и SELECT по этим артикулам возвращает цены... В чем еще может быть причина? |
Сообщ.
#28
,
|
|
|
Цитата TravNik @ В чем еще может быть причина? Посмотри, а такой запрос хоть что нить вернет? WITH Art ("SortKey", "ArtNo") AS ( SELECT * FROM ( VALUES (0, '001459'), (1, '001078'), (2, '001190') ) AS L ) SELECT Art."SortKey", T."Price" FROM Art LEFT JOIN "Server"."Catalog"."Product" AS T ON LTRIM(RTRIM(T."ArtNo")) = '001459' -- <--- ORDER BY Art."SortKey" |
Сообщ.
#29
,
|
|
|
Цитата JoeUser @ Посмотри, а такой запрос хоть что нить вернет? Ничего... Ноль на выходе... |
Сообщ.
#30
,
|
|
|
Цитата TravNik @ Ничего... Ноль на выходе... Покажите запрос В ТОМ ВИДЕ, В КАКОМ ЗАПУСКАЕТЕ. |
Сообщ.
#31
,
|
|
|
Цитата Akina @ В ТОМ ВИДЕ, В КАКОМ ЗАПУСКАЕТЕ. WITH Art ("SortKey", "ArtNo") AS ( SELECT * FROM ( VALUES (0, '001459'), (1, '001078'), (2, '001190') ) AS L ) SELECT Art."SortKey", T."Price" FROM Art LEFT JOIN "SERVER"."Catalog"."Offer" AS T ON T."ArtNo" = '001459' ORDER BY Art."SortKey" Единственное - SERVER меняю на свой. |
Сообщ.
#32
,
|
|
|
А
SELECT T."Price" FROM "SERVER"."Catalog"."Offer" AS T WHERE T."ArtNo" = '001459' записи возвращает? Кстати... а с какой версией сервера мы имеет дело? и в каком клиенте выполняется запрос? клиент вообще переваривает WITH? Ну просто потому, что твой текст запроса, если не вызывает ошибку, просто обязан вернуть как минимум три записи... |
Сообщ.
#33
,
|
|
|
Цитата Akina @ клиент вообще переваривает WITH? Вот и я о том же. "Ничего не возвращать" сервер просто не может. Или возвращает ошибку, или возвращает >= 0 строк. |
Сообщ.
#34
,
|
|
|
Для подключения использую модуль adoConnect. После запроса CountRow=0.
conn.getLastErrorDescription() выдает - no errors. Может частями как-нибудь запрос оттестить? |
Сообщ.
#35
,
|
|
|
Цитата Akina @ Кстати... а с какой версией сервера мы имеет дело? и в каком клиенте выполняется запрос? клиент вообще переваривает WITH? Сервер - MsSQL 2008 R2 А клиент тут причем? Клиент вообще без SQL. Локальные данные сохраняю в свой формат. Весь запрос отправлял на сервер... Может я не так что сделал? |
Сообщ.
#36
,
|
|
|
Цитата TravNik @ А клиент тут причем? Клиент вообще без SQL при том что - Цитата TravNik @ .Для подключения использую модуль adoConnect Создайте на сервере процедуру и получите от нее ответ. |
Сообщ.
#37
,
|
|
|
Цитата Bas @ Создайте на сервере процедуру и получите от нее ответ. Судя по диалогу выше, он (ТС) на серваке ниче делать не может. Еще есть совет. Когда мы пишем чего-то на каком-то языке программирования, зачастую бывает приходится пользоваться отладчиком для выявления трабла. С запросами SQL картина очень похожая. Советую найти норм инструмент для интерактивной отладки запросов. На счет именно M$ SQL не подскажу, но предлагаю глянуть на два продукта - EMS Sql Manager (для конструирования таблиц БД самое то), Navicat (для отладки запросов - просто божественно). Версии с "таблетками от жадности" можно найти на rutracker.org, хотя еще раз подчеркну, не совсем уверен - тянут ли они M$ SQL, ибо я пользую исключительно PostgreSQL, и малеха присматриваюсь к MySQL. Используя выше названные инструменты, можно обойтись без прочих "прокладок" и решать суть - "состоятельность" того или иного запроса. И как только запрос отлажен, только тогда пытаемся вписать его вызов с свою прогу. |
Сообщ.
#38
,
|
|
|
Тс, используй MS Management Studio для отладки запросов.
|
Сообщ.
#39
,
|
|
|
Цитата JoeUser @ Судя по диалогу выше, он (ТС) на серваке ниче делать не может. Судя по диалогу, ТС может использовать в качестве клиента HeidiSQL. А там предложение WITH прекрасно работает - если не накосячить в синтаксисе и версия сервера позволяет. |
Сообщ.
#40
,
|
|
|
Цитата Akina @ Ну на счет HeidiSQL - эт да, клиентская часть бывает такая иногда клиентская))) Я имел ввиду - де-факто невозможность реги своих процедур на серваке БД. удя по диалогу, ТС может использовать в качестве клиента HeidiSQL. |
Сообщ.
#41
,
|
|
|
TravNik, Опять ничего не понял.
Почему не тащите из БД наименование? Что за "особая сортировка артикулов"? "Дерево" чтоли? Так почему оно в файле а не в БД? Нет прав править основную БД так кто запретит создать рядом еще одну? Написать хранимую процедуру да, это на сервере, но это не структура таблиц. Обратитесь к администратору сервера. Часть данных, необходимых для работы ПО в локальном файле юзера а часть на сервере, и в интерфейсе енто надо клеить? Я б расстрелял разработчика. Чесслово. Но если препод (а больше никто так бредово задачу не ставит) захотел то откройте бук он Лайн ( справка от мускул) и найдите там про open xml там и примеры есть как используют этот костыль. Но, повторю, хранить часть данных на сервере а часть где-то в локальном файле черевато большими проблемами. В Вашем случае это "ключ сортировки", возможно еще и наименование артикула, так как в запросе его нет. Может просто от Вас требуют вывод "дерева" в список? Почему в файле и в БД для одного и того же разные типы данных? В чем подвох? JoeUser ваше предложение описывать структуру данных в DDL мягко говоря неверное а точно выражаясь убогое. Если хотите чтобы Ваше описание понял кто-то кроме Вас предоставьте ER диаграмму в одной из общепринятых нотаций Добавлено JoeUser не надо смотреть левых продуктов. Все что надо для работы с ms SQL абсолютно точно указал Mif в 38 сообщении. |
Сообщ.
#42
,
|
|
|
Цитата Павел Калугин @ JoeUser ваше предложение описывать структуру данных в DDL мягко говоря неверное а точно выражаясь убогое. Если хотите чтобы Ваше описание понял кто-то кроме Вас предоставьте ER диаграмму в одной из общепринятых нотаций Павел, ты малеха категоричен. "На заре моей SQL-юности" как-то Akina ткнул меня носом как описывать более правильно БД-шные сущности, и был по сути прав. И вот тут DDL остался единственным вменяемым кандидатом - коротко, ясно и понятно. А если тебе хочется граффити - оно у нас есть! |
Сообщ.
#43
,
|
|
|
WITH Art ("SortKey", "ArtNo") AS ( SELECT * FROM ( VALUES (0, '001459'), (1, '001078'), (2, '001190') ) AS L ) SELECT Art."SortKey", T."Price" FROM Art LEFT JOIN "SERVER"."Catalog"."Offer" AS T ON T."ArtNo" = '001459' ORDER BY Art."SortKey" /* Ошибка SQL (8155): No column name was specified for column 1 of 'L' No column name was specified for column 2 of 'L'. */ /* Affected rows: 0 Найденные строки: 0 Предупреждения: 0 Длительность 0 of 1 query: 0,000 sec. */ |
Сообщ.
#44
,
|
|
|
Цитата JoeUser @ SELECT * FROM ( VALUES (1, 31200, 'Промтовары'), (2, 110, 'Ювелирные издения'), (3, 4777, 'Бытовая химия') ) AS L Мил человек, а в какой версии MSSql это не вернет ошибку вида Сообщение 8155, уровень 16, состояние 2, строка 20 No column name was specified for column 1 of 'L'.? или ты вот этот пример из BOL так "доработал" IF OBJECT_ID('dbo.Person','U') IS NOT NULL DROP TABLE dbo.Person; GO CREATE TABLE dbo.Person(ID int, Name varchar(30), Mother int, Father int); GO INSERT dbo.Person VALUES(1, 'Sue', NULL, NULL) ,(2, 'Ed', NULL, NULL) ,(3, 'Emma', 1, 2) ,(4, 'Jack', 1, 2) ,(5, 'Jane', NULL, NULL) ,(6, 'Bonnie', 5, 4) ,(7, 'Bill', 5, 4); GO -- Create the recursive CTE to find all of Bonnie's ancestors. WITH Generation (ID) AS ( -- First anchor member returns Bonnie's mother. SELECT Mother FROM dbo.Person WHERE Name = 'Bonnie' UNION -- Second anchor member returns Bonnie's father. SELECT Father FROM dbo.Person WHERE Name = 'Bonnie' UNION ALL -- First recursive member returns male ancestors of the previous generation. SELECT Person.Father FROM Generation, Person WHERE Generation.ID=Person.ID UNION ALL -- Second recursive member returns female ancestors of the previous generation. SELECT Person.Mother FROM Generation, dbo.Person WHERE Generation.ID=Person.ID ) SELECT Person.ID, Person.Name, Person.Mother, Person.Father FROM Generation, dbo.Person WHERE Generation.ID = Person.ID; GO |
Сообщ.
#45
,
|
|
|
Цитата Павел Калугин @ Мил человек, а в какой версии MSSql это не вернет ошибку вида Сообщение 8155, уровень 16, состояние 2, строка 20 No column name was specified for column 1 of 'L'.? Положа лапу на сердце - тестил на PostgreSQL'е. Если такой синтаксис не канает - WITH можно заменить вложенным селектом, VALUES - можно заменить UNION'ами. Как говорится, нет преграды патриотам (С) |
Сообщ.
#46
,
|
|
|
TravNik еще раз, объясни неразумному почему ты часть данных хранишь в файле на клиенте? Почему их нет в БД на сервере? Или они там есть а ты про них не знаешь и потому мудришь с файлами на клиенте?
Про танцы с бубном уже писали - делать через XML почитай про xQuery например. из справки DECLARE @x xml SET @x = '<ROOT><a>111</a></ROOT>' SELECT @x.query('/ROOT/a') на крайняк сработает вот такой изврат CREATE table #Art (SortKey INT, ArtNo NVARCHAR(50)) INSERT INTO #Art (SortKey, ArtNo) VALUES (0, '001459'), (1, '001078'), (2, '001190') SELECT * -- тут твои поля, звездочку убрать FROM #Art AS Art -- тут твои джойны ORDER BY Art.SortKey Добавлено Цитата JoeUser @ Положа лапу на сердце - тестил на PostgreSQL'е А чтож бедняге топикстартеру про это ни слова? в MS такое не работает же. |
Сообщ.
#47
,
|
|
|
Цитата Павел Калугин @ А чтож бедняге топикстартеру про это ни слова? в MS такое не работает же. Виноват |
Сообщ.
#48
,
|
|
|
Цитата Павел Калугин @ TravNik еще раз, объясни неразумному почему ты часть данных хранишь в файле на клиенте? Почему их нет в БД на сервере? Или они там есть а ты про них не знаешь и потому мудришь с файлами на клиенте? Модифицировать любым образом серверную бд - не могу, так как откажут в обновлении платформы. Даже создать рядом свою табличку не могу. Любое вмешательство в серверную бд, или файлы платформы = отказ в обслуживании. Доступ и возможность модификации есть. Read only вообщем. |
Сообщ.
#49
,
|
|
|
Можно попробовать преобразовать как-то так:
SELECT * FROM ( SELECT 0 AS "SortKey", '001459' AS "ArtNo" UNION SELECT 1 AS "SortKey", '001078' AS "ArtNo" UNION SELECT 2 AS "SortKey", '001190' AS "ArtNo" ) AS Art LEFT JOIN "SERVER"."Catalog"."Offer" AS T ON T."ArtNo" = '001459' ORDER BY Art."SortKey" Но это я не проверял по синтаксису, чисто предположение. |
Сообщ.
#50
,
|
|
|
TravNik черт тя побери ,. не читаешь, что пишу тебе? Может эти критерии уже есть?
Может на том же сервере рядом создашь еще одну БД со своими примочками? JoeUser так проверь, потом пиши. угу? Добавлено TravNik вот те пример с твоим XML declare @xml xml SELECT @xml='<rows> <row id = "0">001459</row> <row id = "1">001078</row> <row id = "2">001190</row> </rows>' select b.value('@id' , 'int') [id], b.value('.' , 'varchar(50)') [content] from @xml.nodes('/rows/row') a(b) ЗЫ. кстати странно. Сервер пилить низя, а клиента можно.. Ужас просто Добавлено Цитата TravNik @ так как откажут в обновлении платформы. 1 це ,чтоли? |
Сообщ.
#51
,
|
|
|
Цитата Павел Калугин @ Может на том же сервере рядом создашь еще одну БД со своими примочками? Нет этих критериев нет. Я бы мог подробно описать программу, как она работает, почему часть данных храню локально, но поверь, так как работает сейчас - единственный вариант. Я SQL только начал изучать, думал отправить запрос со своим параметром, и получить ответ с сортировкой по этому параметру просто, а оказалось вон как... |
Сообщ.
#52
,
|
|
|
Цитата TravNik @ почему часть данных храню локально, Я отвечу сразу почему и зачем - чтобы потом побольше переделать и чтоб без тебя никто сопровождать не смог На том же сервере MS ты в легкую можешь создать еще одну базу данных и положить в нее свои таблички со своими .... прибабахами В запросе (во фроме) придется писать в виде БД.Схема.Таблица и все, телемаркет... Радуйся. Мало того, если при переносе каком-нибудь файл пролюбишь прога твоя не сломается. А файлы свои ты рано или поздно терять начнешь и иметь головняк почему вдруг работать перестало. Это факт... |
Сообщ.
#53
,
|
|
|
Помогите, чем можИте люди добре.
|
Сообщ.
#54
,
|
|
|
Цитата TravNik @ Это работает, но задача - вернуть цену по артикулу, вместе с номером ячейки, а тут даже обращения к таблице нету... так.. а думать лень совсем? воткни этот запрос во фром (в скобках и после него as art) и сджойни с чем надо Добавлено Скайп это не наш метод |
Сообщ.
#55
,
|
|
|
Цитата Павел Калугин @ JoeUser так проверь, потом пиши. угу? Проверить на M$ SQL'е нет возможности. И ты это ... полегче немного |
Сообщ.
#56
,
|
|
|
смотри сюдой у тебя была написана вот такая хня, по совету мастера прогресса...
WITH Art ("SortKey", "ArtNo") AS ( SELECT * FROM ( VALUES (0, '001459'), (1, '001078'), (2, '001190') ) AS L ) SELECT Art."SortKey", T."Price" FROM Art LEFT JOIN "SERVER"."Catalog"."Offer" AS T ON T."ArtNo" = '001459' ORDER BY Art."SortKey" выкидываем лишнее, остается SELECT Art.SortKey, T.Price FROM [B] Art[/B] LEFT JOIN SERVER.Catalog.Offer AS T ON T.ArtNo = Art.ArtNo ORDER BY Art.SortKey Осталось мелочь, подправить XML и всадить его сюдой declare @xml xml SET @xml='<rows> <row id = "0">001459</row> <row id = "1">001078</row> <row id = "2">001190</row> </rows>' SELECT Art.SortKey, T.Price FROM (select b.value('@id' , 'int') [SortKey], b.value('.' , 'varchar(50)') [ArtNo] from @xml.nodes('/rows/row') a(b) )as Art LEFT JOIN SERVER.Catalog.Offer AS T ON T.ArtNo = Art.ArtNo ORDER BY Art.SortKey |
Сообщ.
#57
,
|
|
|
Цитата Павел Калугин @ так.. а думать лень совсем? воткни этот запрос во фром (в скобках и после него as art) и сджойни с чем надо Я только начал SQL изучать. От моего языка он отличается синтаксисом, построением, логикой. Для меня это темный лес. Не думайте что я ленивый, если бы я хоть чуть разбирался в SQL я наверняка бы сделал сам, но к сожалению не могу. Я понимаю что вы тут друг с другом привыкли общаться на равных, но я нуб. |
Сообщ.
#58
,
|
|
|
Цитата JoeUser @ Джо, ты чайнику задавшему вопрос по MSSql впариваешь ответ с постргресовскими фичами. Я очень мягок... Жаль в рейтинг тебе минусов наляпать не могу... |
Сообщ.
#59
,
|
|
|
Цитата Павел Калугин @ declare @xml xml SET @xml='<rows> <row id = "0">001459</row> <row id = "1">001078</row> <row id = "2">001190</row> </rows>' SELECT Art.SortKey, T.Price FROM (select b.value('@id' , 'int') [SortKey], b.value('.' , 'varchar(50)') [ArtNo] from @xml.nodes('/rows/row') a(b) )as Art LEFT JOIN SERVER.Catalog.Offer AS T ON T.ArtNo = Art.ArtNo ORDER BY Art.SortKey То что нужно!!! Работает ура!!))) Очень благодарен! |
Сообщ.
#60
,
|
|
|
Цитата TravNik @ Я только начал SQL изучать. От моего языка он отличается синтаксисом, построением, логикой. Для меня это темный лес. Не думайте что я ленивый, если бы я хоть чуть разбирался в SQL я наверняка бы сделал сам, но к сожалению не могу. Я понимаю что вы тут друг с другом привыкли общаться на равных, но я нуб. Ты эта, сам попроще. Тут все нубы в том или ином смысле. Вон даже не представляют, что то, что в синтаксисе одного сервера работает "на ура" другой может не воспринимать от слова "совсем" Подумать - я не над не тонкостями языка просил, а именно подумать. Тут простая логика надо. Кирпичики были просто оставалось собрать из них целое. Специально чуть выше расписал тебе. Добавлено TravNik И еще раз подумай про свою БД рядом, со своими данными, структурами и прочей радостью, которых нет в проставке от "вендора" Жить станет на порядки проще и веселей. Файл "данных" на клиенте это конфиги для доступа и инишки с настройкаи клиента "под себя". Все. Конфин не пролюдбишь, тбо без него просто не стартуешь, а инишку потерял и не заметил. Ну настроет юзверь еще раз цвет кнопочек как любит, руки не отсохнут, программа работать не перестанет. С данными другой коленкор. Они должны быть на сервере |
Сообщ.
#61
,
|
|
|
Скрытый текст Цитата Павел Калугин @ Жаль в рейтинг тебе минусов наляпать не могу... Не парься. Давай представим, что ты мне "наляпал" в рейтинг 50 минусов. Естественно, я очень огорчился. А как иначе ... Надеюсь тебе стало немножко веселее? |
Сообщ.
#62
,
|
|
|
Фух, сделал... В итоге загрузка уменьшилась кардинально - с 30 сек до 1.5 сек. Еще раз всем спасибо!
Цитата Павел Калугин @ Жаль в рейтинг тебе минусов наляпать не могу... Всем ДРУЖБЫ!!! И ДОБРА!!! |
Сообщ.
#63
,
|
|
|
JoeUser злой я вчерась был. Очередные бизнестребования третий раз на доработку завернул.
TravNik еще раз очень внимательно подумай над идеей второй БД. Такой простенький список строить так долго это просто ужасть какой-то. Еще раз повторю. У тебя есть сервер MSSQL. На нем лежит база с данными "от поставщика". Ну и флаг ей в руки пусть лежит неприкосновенная. Создаешь на том же сервере новую базу данных. И в ней хранишь всё необходимое тебе. В ней делаешь свои процедуры. И радуешься. |