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

» SQL запрос

Автор: SIgor33
Дата сообщения: 28.02.2011 11:06
chel78
Возможно проблема в том что в системе установлены различные формат дат
У меня было так на русской винде отрабатывалась а на англеской ошибка вылазила.
Пришлось приводить к одному формату, ну если у тебя дата сначала строковая переменная и ты ее преобразуешь советую использовать сразу формат datetime
Автор: chel78
Дата сообщения: 03.03.2011 14:46
Все таки победил, надо вводить дату в формате 01-feb-2011
Автор: asbo
Дата сообщения: 13.03.2011 13:58
Здравствуйте.

Тему начал читать, а пока все же спрошу:

MS Access. Создал и сохранил два запроса:

Qdf_1: SELECT DISTINCT Leg_T FROM Table_001;
Qdf_2: SELECT DISTINCT Leg_S FROM Table_002;

Потом создал и сохранил третий:
Qdf_3: SELECT DISTINCT Qdf_1.Leg_T, Qdf_2.Leg_S
FROM Qdf_1 INNER JOIN Qdf_2 ON Qdf_1.Leg_T = Qdf_2.Leg_S;

Но это все в ГУИ. Все работает. А как мне загнать все это хозяйство в один запрос (организовать вложенные запросы), в одну инструкцию SQL, чтобы потом на ее базе в VBA создать рекордсет?

Что-то типа:
SELECT DISTINCT Leg_T, Leg_S
FROM
(SELECT DISTINCT Leg AS Leg_T FROM Table_001)
INNER JOIN
(SELECT DISTINCT Leg AS Leg_S FROM Table_002)
ON Leg_T = Leg_S; (это не работает)

Автор: asbo
Дата сообщения: 13.03.2011 15:59
Вот! Правильно отсылают - "Читай тему!"
AndVGri, мэни снкс.
Автор: SIgor33
Дата сообщения: 14.03.2011 09:57
asbo

Цитата:
SELECT DISTINCT Leg_T, Leg_S
FROM
(SELECT DISTINCT Leg AS Leg_T FROM Table_001)
INNER JOIN
(SELECT DISTINCT Leg AS Leg_S FROM Table_002)
ON Leg_T = Leg_S; (это не работает)

Используй псевдоним таблиц
FROM
(SELECT DISTINCT Leg AS Leg_T FROM Table_001) AS T1
INNER JOIN
(SELECT DISTINCT Leg AS Leg_S FROM Table_002) as T2
ON T1.Leg_T =T2. Leg_S;
Автор: asbo
Дата сообщения: 14.03.2011 10:44
SIgor33, снкс,
я так и сделал - на второй странице нашел (ссылка в посте выше)
Автор: MbIJIO
Дата сообщения: 14.05.2011 13:30
подскажите, можно выбрать все столбцы кроме определенных?
например таблица table в ней столбцы q, w, e, r, t, y, u
и нужно выбрать все кроме столбца q
это возможно?
Автор: asbo
Дата сообщения: 14.05.2011 14:01
MbIJIO +1
Тоже давно задаюсь вопросом - как закомментить вывод одного или нескольких полей? Ну, что то типа:

SELECT * FROM table SKIP q;
вместо
SELECT w, e, r, t, y, u FROM table;

Добавлено:
SKIP здесь, фиг знает какой, несуществующий, мной выдуманный оператор для отмены вывода поля q
Автор: MbIJIO
Дата сообщения: 14.05.2011 14:13
asbo
не правильный запрос, по крайней мере в phpMyAdmin(MySQL)
есть еще варианты?
Автор: asbo
Дата сообщения: 14.05.2011 14:29
MbIJIO

Цитата:
не правильный запрос, по крайней мере в phpMyAdmin(MySQL)
есть еще варианты?

А можно тоже самое, только по-русски? Что имелось-то ввиду?

Я ни каких вариантов не прелагал, а лишь присоединился к вопросу...

Добавлено:
Поправил и добавил свой пост выше
Автор: Garrett
Дата сообщения: 14.05.2011 17:14
asbo
Если цель скрыть некую инфу (некие столбцы), то надо создать представление(я), куда войдут все несекретные столбцы нужных таблиц. Далее блокируется обычным юзерам доступ к исходным таблицам, но открывается доступ к представлениям, где запрос вида
select * from v_Table;
выведет только те столбцы, которые ему(обычному юзеру) позволено смотреть...
Автор: asbo
Дата сообщения: 14.05.2011 17:23
Garrett, снкс. Только в моем интересе все гораздо проще и меркантильней.

У меня есть несколько широченных таблиц, а к ним несколько запросов. Чаще всего приходится перечислять все поля, вместо звезды и указания пары-тройки тех, которые не должны присутствовать в запросе просто за ненадобностью. Получаются километровые строки. Чтобы не захламлять основной код пришлось писать спец. ф-ции, в которые передаются эти ненужные поля, и в которых уже формируется эта километровая строка запроса. Но, при этом существенно снижается читабельность кода :( ...
Автор: Garrett
Дата сообщения: 14.05.2011 18:24
asbo
Делай представления. Один раз напишешь какие столбцы выбирать, а в программе будет просто select * from v_Table;
Автор: MbIJIO
Дата сообщения: 14.05.2011 18:26
Garrett
так если много таблиц, то надо на каждую делать?
Автор: Garrett
Дата сообщения: 14.05.2011 18:33
MbIJIO
Это смотря какие задачи стоят.
Но представления очень помогают:
- скрывать ненужное;
- скрывать секретное;
- скрыть истинную реализацию;
- делать выборку по каким-то условиям;
- делать рид-онли представления не прибегая к манипулированию правами на insert / update
- и т.д.

На твой вопрос - да. Юзер должен иметь доступ к представлению, но не таблице. Соответственно, представлений должно быть >= кол-ва таблиц.
Автор: MbIJIO
Дата сообщения: 15.05.2011 18:27
Garrett
спасибо
Автор: MasMaX
Дата сообщения: 08.12.2011 13:09
Срочно требуется помощь! Создаю запрос для добавления строки в базу данных. Всё работает кроме следующего момента:

В таблице есть два поля 'AutoID' и 'RGNUM'. Первый имеет свойство autoinc и увилечивается само. В Insert я его не трогаю даже. А второе поле по задумке базы берет значение из первого. Как это реализовать? Точнее как добавить значение номера строки, которое ещё не создана на момент выполнения запроса.
Или делать два запроса и менять поле RGNUM уже после создания записи?
Автор: wasilissk
Дата сообщения: 08.12.2011 13:22
MasMaX
1. Триггер
2. Генератор
3. Зачем вам второе поле, если оно всегда равно первому?
Автор: ekemov
Дата сообщения: 08.12.2011 14:33
Может оно будет не всегда ему равно, либо в запросе где то участвует так что проще через 2 ключа связь делать.
Автор: dneprcomp
Дата сообщения: 08.12.2011 16:22
ekemov
4. Для MS SQL SERVER. Немедленно после Insert сделать

Код: DECLARE @ID as decimal(18, 0)
SET @ID = SCOPE_IDENTITY()
Update [table name] set RGNUM = @ID Where AutoID = @ID
Автор: wasilissk
Дата сообщения: 08.12.2011 17:08
ekemov

Цитата:
либо в запросе где то участвует

Два раза указать одно и то же поле.

Цитата:
проще через 2 ключа связь делать

Как-то это не вяжется с условием.

Цитата:
А второе поле по задумке базы берет значение из первого.
Автор: MasMaX
Дата сообщения: 08.12.2011 21:15
wasilissk
Понятия не имею зачем там два поля, но основным считаеся RGNUM которое не увиличивается само. База у меня огромная (месяц - 150 тыс записей, года 4 ведется), поэтмоу поменять я не смогу а могу лишь подстроиться под нее. Там еще зачем-то поле RGNUM текстовое всегда 10 символов с ведущими пробелами.

Оно ему всегда равно. По крайней мере в той таблице над которой я колдую.

Вс таки я пришел к выводу что проще разделять на два запроса. Даже простой второй запрос получается:
UPDATE d2011 SET rgnum=CAST(autoid as SQL_CHAR) WHERE numdoc=....

Кстати, а где про триггеры-генераторы можно почитать доступным языком? Подозреваю что таким образом и сделано многое в данной базе.
Автор: YuriyRR
Дата сообщения: 08.12.2011 23:18
MasMaX

Цитата:
Кстати, а где про триггеры-генераторы можно почитать доступным языком?

Хелен Борри
Firebird Руководство разработчика баз данных
Автор: wasilissk
Дата сообщения: 09.12.2011 07:08
MasMaX

Цитата:
Кстати, а где про триггеры-генераторы можно почитать доступным языком? Подозреваю что таким образом и сделано многое в данной базе.

Сильно зависит от того, какой сервер у вас используется. Озвучьте.
Автор: aidomars
Дата сообщения: 14.12.2011 13:29
Поможите с запросом.
Имеем таблицу table, в ней поля: ID, дата, время. ID может повторяться.
Надо создать запрос: группировка по ID max(дата), время.
Мой запрос выводит неправильное время, а именно самое максимальное по одному ID. А надо время которое принадлежит строке с максимальной датой.

Код: SELECT table.ID, Max(table.[Дата]) AS [Max-Дата], Max(table.[Время]) AS [Max-Время]
FROM table
GROUP BY table.ID
ORDER BY table.ID;
Автор: AnViSe
Дата сообщения: 14.12.2011 14:20
Так может убрать Max из времени...
Автор: mdid
Дата сообщения: 14.12.2011 14:27
aidomars
если правильно понял то

set dateformat dmy
create table #tmp (id INT, dt datetime)
insert into #tmp
select 1,cast('01.01.2001' as datetime)
union
select 1,cast('03.01.2001' as datetime)
union
select 2,cast('01.03.2001' as datetime)
union
select 2,cast('03.05.2001' as datetime)
union
select 3,cast('01.03.2001' as datetime)
union
select 4,cast('03.01.2001' as datetime)


select id,MAX(dt) from #tmp
group by id

drop table #tmp


ПС
у меня sql 2005 посему нет разделения на date и time
просто уберите мах на тайм..должно помочь
Автор: aidomars
Дата сообщения: 14.12.2011 14:52
AnViSe, mdid
Max убираю из времени, ругается "Попытка выполнить запрос, который не включает указанное выражение 'Время' как часть статистической функции или группы."
Last использовать тоже не получается.
Автор: AnViSe
Дата сообщения: 14.12.2011 15:19
Дабы правильно понять постановку задачи приведи пример исходных данных и требуемый результат запроса.
Заодно укажи SQL движок на всякий случай.
Автор: dneprcomp
Дата сообщения: 14.12.2011 16:20
aidomars
Попробуй

Код: SELECT TOP 1 ID, [Дата] AS [Max-Дата], [Время] AS [Max-Время]
FROM table
ORDER BY [Дата] DESC, [Время] DESC, ID DESC

Страницы: 1234567891011121314

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


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