Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Открыть новую тему     Написать ответ в эту тему

mdid

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Keiichi
используйте profiler для получения имени таблицы...а потом запросом

Всего записей: 1298 | Зарегистр. 13-02-2006 | Отправлено: 16:35 21-05-2010 | Исправлено: mdid, 16:37 21-05-2010
chel78



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Привет, у меня такое вот дело.
 есть  SQL запрос
 
Код:
 
SELECT
SYSDTL.SHIPID,
SYSTRN.TRNQTY,
SYSTRN.SYSDAT,
CUSTMR.CSTNAM
FROM
SYSDTL
Inner Join SYSTRN ON SYSTRN.TRNSEQ = SYSDTL.TRNSEQ
Inner Join ORDHDR ON SYSDTL.ORDNUM = ORDHDR.ORDNUM
Inner Join CUSTMR ON ORDHDR.PLNNUM = CUSTMR.PLNNUM
WHERE
SYSTRN.TRNTYP = 'CASPIK'
 

   
где результат SYSDTL.SHIPID- номер заказа, SYSTRN.TRNQTY - колличество, SYSTRN.SYSDAT - время транзакции.
необходимо  ссумировать SYSTRN.TRNQTY в пределах заказа, сргупировать по SYSDTL.SHIPID, CUSTMR.CSTNAM и главное ссумировать время в минутах между первой и последней транзакцией, в пределах  SYSDTL.SHIPID. И если в пределах одного  SYSDTL.SHIPID  только одна транзакция - оставить так как есть.

Всего записей: 124 | Зарегистр. 19-01-2007 | Отправлено: 19:49 08-06-2010 | Исправлено: chel78, 07:36 09-06-2010
mmi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попробуйте так. Это для MS SQL-я. Для заказов с одной транзакцией, как и для заказов с несколькими, но с одинаковым временем разница в минутах будет нулевой.
 

Код:
 
SELECT  
SYSDTL.SHIPID,  
sum(SYSTRN.TRNQTY) as TRNQTY,  
datediff(minute,min(SYSTRN.SYSDAT),max(SYSTRN.SYSDAT)),  
CUSTMR.CSTNAM  
FROM  
SYSDTL  
Inner Join SYSTRN ON SYSTRN.TRNSEQ = SYSDTL.TRNSEQ  
Inner Join ORDHDR ON SYSDTL.ORDNUM = ORDHDR.ORDNUM  
Inner Join CUSTMR ON ORDHDR.PLNNUM = CUSTMR.PLNNUM  
WHERE  
SYSTRN.TRNTYP = 'CASPIK'  
GROUP BY
SYSDTL.SHIPID,
CUSTMR.CSTNAM
 

Всего записей: 28 | Зарегистр. 28-01-2003 | Отправлено: 21:16 09-06-2010
Man_Without_Face



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток. Есть такой вот запрос:
Подробнее...
 
Допустим в таблице invoicecards три записи, в payments две. С помощью джоинов идет объединение, получается декартово произведение, т.е. получается шесть строк. Вопрос: можно ли как-нибудь изменить этот запрос, чтобы шли сначала три строки из invoicecards (поля соответствующие payments значение Null), а потом две строки из payments (поля соответствующие invoicecards значение Null)?

Всего записей: 381 | Зарегистр. 25-01-2010 | Отправлено: 12:08 15-06-2010
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Man_Without_Face
особо не смотрел, но что-то не заметно у тебя в запросе условия связки этих таблиц. так что ты собственно и получаешь cross join, тогда как тебе нужен full

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 18:44 15-06-2010
mmi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Man_Without_Face

Цитата:
Вопрос: можно ли как-нибудь изменить этот запрос, чтобы шли сначала три строки из invoicecards (поля соответствующие payments значение Null), а потом две строки из payments (поля соответствующие invoicecards значение Null)?

 
Про FULL JOIN уже Вам написали, того же можно добиться при помощи UNION-ов.
Порядок следования строк в результате определяется конструкцией ORDER BY.
 
invoicecards - это счета?
payments - это платежи?
 
Платежи и счета никак напрямую никак не связаны?  Есть ли смысл их вообще вместе показывать?

Всего записей: 28 | Зарегистр. 28-01-2003 | Отправлено: 21:16 15-06-2010
megamozg13



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всем доброго времени суток.
Задачка запросом перекинуть значение поля из одной таблички в другую, таблицы в разных папках, фактически они одинаковые по данным и структуре.
 
"UPDATE  'C:\Base2\v_plat.db' SET v_plat.JOINHOZ=t_plat.JOINHOZ (SELECT JOINHOZ FROM 'C:\Base1\t_plat.db' WHERE (t_plat.indeks = v_plat.indeks))"
 
Borland BDE, таблички DB/paradox.
 
Гуру, в чем я не прав в запросе.

Всего записей: 313 | Зарегистр. 27-07-2004 | Отправлено: 12:32 17-06-2010 | Исправлено: megamozg13, 12:32 17-06-2010
mmi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попрбуйте так:
 

Код:
 
UPDATE  'C:\Base2\v_plat.db' a SET a.JOINHOZ=(SELECT JOINHOZ FROM 'C:\Base1\t_plat.db' b WHERE b.indeks = a.indeks)
 

Всего записей: 28 | Зарегистр. 28-01-2003 | Отправлено: 22:55 17-06-2010
megamozg13



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mmi

Цитата:
Попрбуйте так: UPDATE  'C:\Base2\v_plat.db' a SET a.JOINHOZ=(SELECT JOINHOZ FROM 'C:\Base1\t_plat.db' b WHERE b.indeks = a.indeks)  

Заработала!!! (с) Кот Матроскин
премного благодарен, тока записей много достаточно долго работает, буду дальше оптимизировать...
 
 
 
 
Добавлено:
Еще, вопрос, т.к. вся струкура полей в двух таблицах одинаковая можно ли каким хитрым способом сделать копирование данных из одной в другую "Insert ... Select..." без перебора всех полей?

Всего записей: 313 | Зарегистр. 27-07-2004 | Отправлено: 10:00 18-06-2010 | Исправлено: megamozg13, 10:01 18-06-2010
SAURONoff



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте! нужна помощь с запросом)
 
Имеется таблица. Два столбца. нужно сделать запрос, чтобы в результате был третий столбец с цифрой, зависящей от значений первых двух.  
если точнее... первый столбец - класс номера, второй столбец - вид размещения. Вбиты числовые значения. Если в первом цифра 30, а во втором 1, то в третьем должна быть цифра 300. Вариантов значений не так много, так что указать их все в запросе не проблема. Проблема с видом запроса.  
Я так понимаю, что там что-то вроде " SELECT Rocl, Razm, CASE Rocl WHEN 30 THEN '300' " должно быть, а как сделать по аналогии с двумя параметрами?

Всего записей: 49 | Зарегистр. 04-05-2007 | Отправлено: 16:05 18-06-2010
mmi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SAURONoff
 
Универсального рецепта нет, нужно уточнить для чего пишите.
Например для MS SQL  будет как-то так:
 

Код:
select  
case  
  when Rocl = 30 and Razm > 10 then '300'
  when Rocl = 30 then '...'
  ....
  else '???'
end
 

 
Добавлено:
megamozg13
 
Если структуры совпадают, то:

Код:
 
insert into 'c:\dest.db'
select * from 'c:\src.db'
 

 
А вообще SQL для paradox-а по-моему от лукавого, т.к. это вам не сервер БД. В качестве альтернативы, можно всегда самому в коде:
 

Код:
 
...
with tSrc do
begin
  First;
  while not EOF do
  begin
// Ищем по ключу
     if tDest.Locate(...) then
       tDest.Edit
     else
       tDest.Insert;
// Заполняем интересующие поля  
     tDest.FieldByName(...).Value := FieldByName(...).Value;
...
     tDest.Post;      
     Next;
  end;
end;
...
 

 
Еще в BDE есть компонент TBatchMove, вроде бы специально заточенный под подобные задачи.
 
Ну и если требуется просто копирование таблицы paradox, можно обойтись простым копированием соответсвующих файлов.
 
Желаю успехов!

Всего записей: 28 | Зарегистр. 28-01-2003 | Отправлено: 22:13 18-06-2010
megamozg13



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mmi
 

Цитата:
Если структуры совпадают, то:  
Код: insert into 'c:\dest.db' select * from 'c:\src.db'

 
Что-то я снова буксую.
хочу уточнить: количество и названия полей (и их типы) совпадают, но порядок в таблицах разный - это влияет как либо?
и еще, талицы в разных местах и разных дисках, но всё в пределах одного компа.
Может длинные(более 8ми симв.) имена папок/файлов?

Всего записей: 313 | Зарегистр. 27-07-2004 | Отправлено: 14:52 23-06-2010 | Исправлено: megamozg13, 14:55 23-06-2010
mmi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
megamozg13
 

Цитата:
, но порядок в таблицах разный  

 
Тогда либо в select-е явно указываете в правильном порядке столбцы, либо в insert-е.
Вот так вроде работает:

Код:
 
insert into 'c:\customer.db' (
CustNo,
Company,
Addr1,
Addr2,
City,
State,
Zip,
Country,
Phone,
FAX,
TaxRate,
Contact,
LastInvoiceDate
)
select * from 'c:\1ABCDEFGHIGKLMNOPRST\customer.db'
 

 

Цитата:
Что-то я снова буксую

А что за ошибка? Может ограничение уникального ключа вставке мешает и т.п.?
 
TBachMove не посмотрели?

Всего записей: 28 | Зарегистр. 28-01-2003 | Отправлено: 20:17 23-06-2010
Keiichi



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем!
 
Помогите, пожалуйста, разобраться с данным запросом:
 

Код:
1. SELECT
2.                 *      
3.            FROM dbo.Document_view d
4.                LEFT JOIN dbo.DocText dt ON d.DocText = dt.ObjectID
5.                JOIN dbo.Document_view dmain ON dmain.ObjectID = d.OriginalDoc
6.                JOIN dbo.[Case] cas ON cas.Document = dmain.ObjectID
7.                LEFT JOIN dbo.Distribution distr ON distr.CaseForLast = cas.ObjectID
8.            WHERE
9.                d.DocTypeCode LIKE 'AC%'
10.                AND
11.                dmain.DocTypeCode='US'
12.                AND  
13.                d.Date BETWEEN @BeginDate AND @EndDate
14.            ORDER BY d.Date

 
1) Правильно ли я понял, что первая команда LEFT JOIN и последующие JOIN (без left) - это соответствует сложению условий типа AND ? Т.е. строки 4-6 это одно общее перемножение таблиц с учетом всех трех условий?
1.5) И это большое перемножение таблиц перемножается с еще одним в строке 7 ?
2) Команда типа "Document_view d" - задает краткое имя "d" для дальнейшего обращения. А что делает команда "_view" ??
3) Получается так, что одна и та же таблица берется два раза, но с двумя разными короткими именами: dbo.Document_view d = dbo.Document_view dmain ?
4) что значит написание таблицы в скобках: dbo.[Case] ?
5) условия в строках 9-13 идут через оператор AND, т.е. должны выполняться все. Но почему в результатах данного запроса нет DocTypeCode равного "US", но есть "DocTypeCode" равный "AC009", при условии, что изначально в таблице dbo.Document вообще нет такого столбца - DocTypeCode ?
 
Заранее огромная признательность за помощь

----------
C уважением, Keiichi.

Всего записей: 696 | Зарегистр. 16-08-2004 | Отправлено: 16:23 16-07-2010
Itoshiki



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Keiichi,
Цитата:
1) Правильно ли я понял, что первая команда LEFT JOIN и последующие JOIN (без left) - это соответствует сложению условий типа AND ? Т.е. строки 4-6 это одно общее перемножение таблиц с учетом всех трех условий?
1.5) И это большое перемножение таблиц перемножается с еще одним в строке 7 ?  

Нет, можно считать, что каждый JOIN работает отдельно.
LEFT JOIN dbo.DocText означает "если в таблице DocText существуют записи, соответствующие условиям, объединить с ними, иначе использовать запись null"

Цитата:
А что делает команда "_view"

Это не команда, в базе данных существует объект с именем "dbo.Document_view", который скорее всего является не таблицей, а выборкой (представлением, view).

Цитата:
3) Получается так, что одна и та же таблица берется два раза, но с двумя разными короткими именами: dbo.Document_view d = dbo.Document_view dmain ?  

Да.

Цитата:
4) что значит написание таблицы в скобках: dbo.[Case] ?  

В квадратных скобках пишутся имена объектов, совпадающие с ключевыми словами SQL или содержащие специальные символы (пробелы, иногда русские буквы).

Цитата:
5) условия в строках 9-13 идут через оператор AND, т.е. должны выполняться все. Но почему в результатах данного запроса нет DocTypeCode равного "US", но есть "DocTypeCode" равный "AC009", при условии, что изначально в таблице dbo.Document вообще нет такого столбца - DocTypeCode ?  

Столбец DocTypeCode находится в представлении Document_view. Каждая запись, получающаяся в результате выполнения SELECT содержит 2 различных столбца DocTypeCode: d.DocTypeCode и dmain.DocTypeCode. Первый относится к "текущему документу", второй - к "оригинальному", соответственно и ограничения выборки на них разные.

Всего записей: 5 | Зарегистр. 03-07-2010 | Отправлено: 22:03 17-07-2010 | Исправлено: Itoshiki, 22:06 17-07-2010
Keiichi



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Itoshiki
Спасибо огромное!
 

Цитата:
Нет, можно считать, что каждый JOIN работает отдельно.  
LEFT JOIN dbo.DocText означает "если в таблице DocText существуют записи, соответствующие условиям, объединить с ними, иначе использовать запись null"  

 
Таким образом, команда JOIN "если в таблице DocText существуют записи, соответствующие условиям, объединить с ними, не используя запись null" ?
Т.е. команда JOIN (без LEFT) - это внутреннее объединение, равносильное INNER JOIN?

----------
C уважением, Keiichi.

Всего записей: 696 | Зарегистр. 16-08-2004 | Отправлено: 10:34 19-07-2010 | Исправлено: Keiichi, 13:22 19-07-2010
Andryshok



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
выдаст он выдаст, мне нада UPDATE всех записей сделать  с ноликов на эти значения

Тут брат тебе нужна хранимая процедура , которая будет создавать новую табличку либо как ты хочешь обновлять твою

Всего записей: 649 | Зарегистр. 03-06-2009 | Отправлено: 10:46 21-07-2010
salexn1



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Т.е. команда JOIN (без LEFT) - это внутреннее объединение, равносильное INNER JOIN?

да это так

Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 10:51 21-07-2010
frb_noname

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть таблица contact, в которой в поле value лежат телефоны, занесенные в правильном и неправильном (начинаются с "8-") формате.
 
Запрос
Код:

Код:
select value from contact where value like '8-%'

выводит записи с неправильным форматом телефона.
 
Как сделать апдейт поля value по этому критерию отбора, убрав при этом "8-", а ОСТАЛЬНОЕ ЗНАЧЕНИЕ ОСТАВИВ ПРЕЖНИМ ?

Всего записей: 47 | Зарегистр. 03-11-2008 | Отправлено: 09:21 22-07-2010 | Исправлено: frb_noname, 09:25 22-07-2010
volser

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
frb_noname
Какая БД?

Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 09:42 22-07-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru