Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» SQL запрос

Автор: mmi
Дата сообщения: 18.06.2010 21:13
SAURONoff

Универсального рецепта нет, нужно уточнить для чего пишите.
Например для MS SQL будет как-то так:


Код: select
case
when Rocl = 30 and Razm > 10 then '300'
when Rocl = 30 then '...'
....
else '???'
end
Автор: megamozg13
Дата сообщения: 23.06.2010 13:52
mmi


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


Что-то я снова буксую.
хочу уточнить: количество и названия полей (и их типы) совпадают, но порядок в таблицах разный - это влияет как либо?
и еще, талицы в разных местах и разных дисках, но всё в пределах одного компа.
Может длинные(более 8ми симв.) имена папок/файлов?
Автор: mmi
Дата сообщения: 23.06.2010 19:17
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'
Автор: Keiichi
Дата сообщения: 16.07.2010 15:23
Привет всем!

Помогите, пожалуйста, разобраться с данным запросом:


Код: 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
Автор: Itoshiki
Дата сообщения: 17.07.2010 21:03
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. Первый относится к "текущему документу", второй - к "оригинальному", соответственно и ограничения выборки на них разные.
Автор: Keiichi
Дата сообщения: 19.07.2010 09:34
Itoshiki
Спасибо огромное!


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


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

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

Тут брат тебе нужна хранимая процедура , которая будет создавать новую табличку либо как ты хочешь обновлять твою
Автор: salexn1
Дата сообщения: 21.07.2010 09:51

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

да это так
Автор: frb_noname
Дата сообщения: 22.07.2010 08:21
Есть таблица contact, в которой в поле value лежат телефоны, занесенные в правильном и неправильном (начинаются с "8-") формате.

Запрос
Код:

Код: select value from contact where value like '8-%'
Автор: volser
Дата сообщения: 22.07.2010 08:42
frb_noname
Какая БД?
Автор: frb_noname
Дата сообщения: 22.07.2010 08:53
informix 9.30
Автор: SIgor33
Дата сообщения: 22.07.2010 12:49
frb_noname
UPDATE
contact
SET
value = substring(value,3,len(value)-3)
where
value like '8-%'
Если не подерживается функция len поставь максимальное значение длины поля
substring(value,3,255)
Автор: frb_noname
Дата сообщения: 22.07.2010 15:44

Цитата:
SIgor33

Так просто... спасибо
Автор: VadKomarov
Дата сообщения: 27.07.2010 09:18
Приветствую.
Помогите разобраться с sql запросом. (проблемма в том что я вообще не знаю sql)

есть удалённая БД на Oracle (к ней я через sql запросы обращаюсь и нахожу нужную информацию по необходимым мне полям)
пример обращения

SELECT FAM, IMA, OTC, DOT ADMEXP.EXPRESS WHERE FAM='ИВАНОВ' AND IMA='ИВАН' AND OTC='ИВАНОВИЧ' AND DOT BETWEEN'01.01.2009' AND '31.12.2009'


а возникла необходимость произвести выборку из этой БД но выбирать надо по параметрам которые есть у меня локально в MSAccess файле, конечно можно сделать 100000 таких простеньких запросов и просто умереть на рабочем месте... но я всё же надеюсь на положительный результат...

пример
в БД еть поля Ф. И. О. Дата операции, Сумма .....
в локальном файле поля F. I. O. Дата рождения, ......

так надо выбрать все записи из БД но только те что присутствуют в локальном файле.

ожидаемый результат
Иванов Иван Иванович 01.01.2010 15000
Иванов Иван Иванович 01.02.2010 14800
...
Петров Петр Петрович 01.01.2010 25000
Петров Петр Петрович 01.02.2010 17000
...
Сидоров Сидр Сидорович 01.01.2010 11000
Сидоров Сидр Сидорович 01.02.2010 12000
Сидоров Сидр Сидорович 01.03.2010 11000
Сидоров Сидр Сидорович 01.04.2010 11300
....

Огромная просьба подскажите как сделать такой запрос.!!!
Автор: salexn1
Дата сообщения: 27.07.2010 09:41
VadKomarov
Вот тут hттp://www.orafaq.com/node/60 ответ как это делать
Автор: VadKomarov
Дата сообщения: 27.07.2010 10:04
salexn1
Спасибо почитал...

вот только всё таки ворос остался открытым...
а можно обратиться к локальному файлу таким образом.. ну или точнее подобным
SELECT * FROM 'D:\Vad\1.mdb'

и прочитав его содержимое .. произвести выборку на удалённой БД
Автор: salexn1
Дата сообщения: 27.07.2010 10:14
VadKomarov
ну если Вы сделали все то, что написано в статье, то потом можно сделать например так:

select fam, .... from ORACLE_TABLE
WHERE fam in (SELECT FAM_ACCESS FROM MY_ACCESS_TAB@ACCESS_DB)
Автор: VadKomarov
Дата сообщения: 27.07.2010 10:31
salexn1
спасибо ... сейчас буду пробовать написать запрос...
Автор: VadKomarov
Дата сообщения: 28.07.2010 05:06
salexn1
Здравствуйте. Тот вариант который вы предлагаете достаточно не удобен будет из за того что каждый раз надо будет прописывать доступ к необходимым файлам, хотя огромное спасибо.. я возьму это на заметку в будущем .... было бы гораздо проще просто указывать путь к искомому файлу уже в готовом sql запросе и работать ....

а можно ли сделать что то подобное (нашел в интернете но это в SQL Server Management Console)

Код: IF OBJECT_ID('tempdb.dbo.#tmpTable') IS NOT NULL
DROP TABLE dbo.#tmpTable;
CREATE TABLE #tmpTable(
[column0] [varchar] (255) NULL,
[column1] [varchar] (255) NULL,
[column2] [varchar] (255) NULL,
[column3] [varchar] (255) NULL,
[column4] [varchar] (255) NULL,
[column5] [varchar] (255) NULL,
[column6] [varchar] (255) NULL,
[column7] [varchar] (255) NULL,
[column8] [varchar] (255) NULL,
)
BULK INSERT #tmpTable FROM 'c:\1.txt'
WITH (
CHECK_CONSTRAINTS,
CODEPAGE='ACP',
DATAFILETYPE='char',
FIELDTERMINATOR='\t',
ROWTERMINATOR='\n',
KEEPIDENTITY,
TABLOCK)
select * from #tmpTable
Автор: salexn1
Дата сообщения: 28.07.2010 18:21
VadKomarov
Ну конечно данный код не будет работать в Оракле, т.к. это для MSSQL код .
Как сделать так же как в MSSQL пока не знаю... Если нарою - дам знать
Автор: chel78
Дата сообщения: 29.08.2010 19:23
Привет, помогите решить..
есть запрос Oracle

Цитата:
SELECT
LIVE3.SYSDTL.SHIPID AS "SHIPMENT",
SUM (LIVE3.SYSTRN.TRNQTY) AS "CS",
min(LIVE3.SYSTRN.SYSDAT) AS "Start",
max(LIVE3.SYSTRN.SYSDAT) AS "Finish"
FROM
LIVE3.SYSTRN, LIVE3.SYSDTL
WHERE
LIVE3.SYSTRN.TRNSEQ = LIVE3.SYSDTL.TRNSEQ AND
LIVE3.SYSTRN.TRNTYP = 'CASPIK'
AND LIVE3.SYSDTL.SHIPID IS NOT NULL
and SYSTRN.SYSDAT >= to_date('&SDATE')
and SYSTRN.SYSDAT <= to_date('&EDATE')
GROUP BY
LIVE3.SYSDTL.SHIPID;

который отображает

Цитата:
SHIPMENT CS Strat Finish
------------ ---------------- ------------------- -------------------
0008543144 83 08/02/2010 10:09:36 08/02/2010 10:17:17
0008543145 83 08/02/2010 10:14:33 08/02/2010 10:24:22
0008576832 52 08/02/2010 12:09:21 08/02/2010 12:09:21
0008576833 16 08/02/2010 08:45:38 08/02/2010 08:50:00
0008576838 5 08/02/2010 08:29:22 08/02/2010 08:29:22
0008576839 30 08/02/2010 10:42:35 08/02/2010 10:42:35
0020255551 3 08/02/2010 06:46:38 08/02/2010 06:46:47


Необходимо от Finish отнять Start и отобразить это в столбце в формате HH:MI:SS
Автор: volser
Дата сообщения: 29.08.2010 23:15
chel78
А если разница будет больше 24 часов, что тогда делать?
Автор: chel78
Дата сообщения: 30.08.2010 06:30

Цитата:
А если разница будет больше 24 часов,

Разница не будет быть больше 24х часов....
Автор: chel78
Дата сообщения: 01.09.2010 21:24
Как я понял, идей никаких...
Автор: volser
Дата сообщения: 01.09.2010 23:19
chel78
Напишите функцию которая на вход принимает две даты и возвращает строку. Разница двух дат есть дробное число. Целая часть количество дней. Дробная часть часы, минуты, секунды.
Количество секунд = дробная часть * 24 * 60 * 60. Зная количество секунд можно получить результат в нужном формате.
Автор: salexn1
Дата сообщения: 02.09.2010 00:15
chel78
для начала делаешь with на свой запрос,типа
WITH query AS
(
SELECT
LIVE3.SYSDTL.SHIPID AS "SHIPMENT",
SUM (LIVE3.SYSTRN.TRNQTY) AS "CS",
min(LIVE3.SYSTRN.SYSDAT) AS "Start",
max(LIVE3.SYSTRN.SYSDAT) AS "Finish"
FROM
LIVE3.SYSTRN, LIVE3.SYSDTL
WHERE
LIVE3.SYSTRN.TRNSEQ = LIVE3.SYSDTL.TRNSEQ AND
LIVE3.SYSTRN.TRNTYP = 'CASPIK'
AND LIVE3.SYSDTL.SHIPID IS NOT NULL
and SYSTRN.SYSDAT >= to_date('&SDATE')
and SYSTRN.SYSDAT <= to_date('&EDATE')
GROUP BY
LIVE3.SYSDTL.SHIPID)

Ну а дальше

SELECT query.SHIPMENT, query.cs, query.Start, query.Finsh,
to_char(to_date('00:00:00','HH24:MI:SS') + (Finish - Start), 'HH24:MI:SS') diff_time
FROM query
Автор: korol26
Дата сообщения: 03.10.2010 22:04
Ребят, помогите найти решение проблемы.

Имеется две таблицы в MS SQL Server

В 1ой описано количество материалов на филиале.
N_Mater
Kolichestvo

Во второй описано количество материалов на всех филиалах.
N_filiala
N_Mater
Kolichestvo

Как сделать так, чтобы данные о количестве материалов из первой таблицы скидывались во вторую и при этом автоматически выставлялся номер филиала?

Заранее, спасибо!
Автор: Tantos
Дата сообщения: 04.10.2010 08:26
korol26
Как в первой таблице понять, какая запись какому филиалу принадлежит? Если никак, то увы - только выставлять ручками в программе.
Автор: korol26
Дата сообщения: 04.10.2010 22:01
в первой таблице все записи принадлежат одному филиалу
просто у каждого филиала есть одна таблица, в которой содержится количество материалов на этом филиале.

таблицу на филиале можно и изменить, мне главное, чтобы во второй таблице собирались все данные из первой)
Автор: dneprcomp
Дата сообщения: 04.10.2010 22:59
korol26

Я бы добавил в table 1 поле N_filiala.
Потом делал бы INSERT, что бы синхронизировать tables по полю N_Mater. Т.о., если в table 1 добавлен N_Mater, он добавится и в table 2. Если названия не менются и не добавляются, то Insert можно не делать.
Но поле добавить обязательно.

Код: INSERT INTO [table 2] (N_filiala, N_Mater)
SELECT N_filiala, N_Mater
FROM [table 1] LEFT OUTER JOIN [table 2] on [table 1].N_filiala = [table 2].N_filiala
and [table 1].N_Mater = [table 2].N_Mater
WHERE [table 2].N_Mater Is Null

Страницы: 1234567891011121314

Предыдущая тема: Строковый параметр в REG_BINARY


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.