Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Select from select  [new]
Buka
Guest
Прошу прощения за возможную чайниковость вопроса, но как организовать для MS SQL 2000 запрос типа
-----------------------------------------
select a.id, b.id from a, (select c.id from d) b
where a.node, b.node
-----------------------------------------
хотелось бы синтаксис запроса типа select from select
или ссылки на соотв. статьи.
В "Books Online" не нашел, мож искал плохо?
17 июн 02, 16:59    [35072]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Белов Владимир
Guest
select a.id, a1.id, c.id
from
a_table a, c_table c
17 июн 02, 17:29    [35075]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Buka
Guest
Меня интересует именно эта кострукция!
Я ж упрощенно привел пример, чтобы в общих чертах понятно было.
Хотелось бы чтобы в запросе подзапрос можно было бы использовать так же как таблицу.
Вопрос в том возможно ли это для MS SQL 2000?
17 июн 02, 17:35    [35081]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Glory
Member

Откуда:
Сообщений: 104760
При использовании подзапроса в качестве столбца, подзапрос должен возвращать single value - т.е. одно единственное значение, но никак не набор

Или может быть вы имеете ввиду следующее

select a.id, b.id
from a
INNER JOIN (select d.id, d.node from d) AS b
on a.node = b.node
17 июн 02, 17:42    [35082]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Buka
Guest
2 Glory:

Меня интересует возможность использования результатов одного запроса в качестве исходной таблицы для др. запроса, но чтобы все это было реализовано одним запросом.
Хотелось бы, чтобы был запрос в запросе.
Типа
select a.var_id, (select num_dog from dog_in b where a.dog_in_id=b.dog_in_id) as qq from [var] a
Но не совсем.
Т.е. я хочу одним запросом след. действия:
1. select a.field1, a.field2, a.field3, a.id from a where a.id=<условие> into temp
2. select b.field1,b.field2,b.field3,temp1.field1,temp1.field2, temp1.field3 from b, temp1 where temp1.id=b.id
Т.е., чтобы для второго запроса использовались данные возвращенные первым (выборка осуществлялась не по всей таблице "a", а по ее подмножеству, полученному в рез-те выполнения запроса 1.).

2 Белов Владимир
Не подходит такой вариант - это декартово произведение и сие не устраивает. Я ж утрировал в примере - реально в запросе используется более 20 таблиц и там такое получается в рез-те декартового произведения, что в пору за голову хвататься.
17 июн 02, 18:19    [35088]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Buka
Guest
Поправочка!

2 Glory:

Т.е. я хочу одним запросом след. действия:
1. select a.field1, a.field2, a.field3, a.id from a where a.id=<условие> into temp1
2. select b.field1,b.field2,b.field3,temp1.field1,temp1.field2, temp1.field3 from b, temp1 where temp1.id=b.id
17 июн 02, 18:21    [35089]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну так в чем проблема-то ?


use northwind
go
select *
from orders a, (select * from employees where firstname like 'M%') b
where a.employeeid = b.employeeid
17 июн 02, 18:34    [35090]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
2 Buka
На самом деле у Вас несколько странные желания.
Ваш запрос

select a.var_id, (select num_dog from dog_in b where a.dog_in_id=b.dog_in_id) as qq from [var] a

эквивалентен такому:

select a.var_id, num_dog from [var] a, dog_in b where a.dog_in_id=b.dog_in_id

откажитесь от своих стереотипов. ну и думать всё равно немного надо

скорее всего можно написать как-то так:

select b.field1,b.field2,b.field3,temp1.field1,temp1.field2, temp1.field3 from b, a temp1 where temp1.id=b.id and temp1.id=<условие>
18 июн 02, 10:23    [35147]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Buka
Guest
2 SergSuper:
я ж сразу извинился за чайниковость вопроса - это раз, во-вторых - насчет эквивалентности запросов согласен, но мне как раз нужна была конструкция которая реализует что-то типа этого:
use northwind
go
select *
from orders a, (select * from employees where firstname
like 'M%') b
where a.employeeid = b.employeeid
а эта конструкция:
select a.var_id, (select num_dog from dog_in b where a.dog_in_id=b.dog_in_id) as qq from [var] a
всего лишь не совсем удачный пример.
В реальной задаче все намного сложнее и описание ее заняло бы много времени и места. Поэтому я всего лишь попытался немного отвлечься от конкретики.

2 Glory:
Саписибо - это именно то, что нужно. Странно только то, что я пытался что-то подобно сделать и получал в ответ ругань, а сечас все ОК. Наверное, что-то с интаксисом путал.

ВСЕ-РАЗОБРАЛСЯ, ВСЕМ СПАСИБО.
18 июн 02, 14:25    [35192]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
2 Buka
Я надеюсь Вы это понимаете, но на всякий случай напишу: если во вложенном запросе нет group by, то использовать конструкцию, которую предложил Glory, не имеет смысла - она может быть легко заменена на простой запрос из объединённых таблиц.
18 июн 02, 14:52    [35197]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Buka
Guest
2 SergSuper:
есть distinct во вложенносм запросе

>если во вложенном запросе нет group by, то
>использовать конструкцию, которую предложил Glory,
>не имеет смысла
все-таки не понятно почему
>она может быть легко заменена на простой запрос из
>объединённых таблиц
типа вместо
select * from orders a, (select * from employees where firstname like 'M%') b where a.employeeid = b.employeeid
(все-таки здесь сначала отбираются записи, а потом строится декатрово произведение "a" и "b", на которые накладывается потом условие)

можно
select a.*,b.* from orders a, employees b
where (b.firstname like 'M%') and (a.employeeid = b.employeeid)
(а здесь вроде сначала строится декартово произведение, а потом налагаются условия)

а что в этом случае оптимизатор преобразует данную конструкцию к простому запросу из объединённых таблиц?
я в общем то думал, что результат подзапроса сохраняется в некоей временной таблицы, откуда в дальнейшем используется для выполнения самого запроса. если я не прав - поясните почему.

ЗЫ. Прошу ежели чего шапками не закидывать ;-)
18 июн 02, 16:51    [35222]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Buka
Guest
План посмотрел - сам вижу. Вопрос снимается.
18 июн 02, 16:58    [35223]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Dominic
Guest
Коллеги, применительно к теме "SELECT from SELECT":
обратите внимание на фичу MSSQL2000 - возможности использования в бланках запросов функций, определяемые пользователем. Я от них в совершенном восторге (в плане производительности - тоже) и широко начал использовать. Применительно к обсуждавшемуся запросу к Northwind:

CREATE FUNCTION dbo.select_from_employees(@symbol CHAR(1))
RETURNS TABLE
AS
RETURN SELECT
* FROM employees WHERE firstname LIKE @symbol + '%'

GO

SELECT *
FROM orders a INNER JOIN select_from_employees('M') b
ON a.employeeid = b.employeeid

GO

DROP FUNCTION dbo.select_from_employees
19 июн 02, 06:04    [35268]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Select from select  [new]
Midaff
Member

Откуда:
Сообщений: 1
День добрый,

У меня вопрос по сути по той же теме но предложенными вариантами я его реализовать не смог.
В моём случае суть задачи такая:
Необходимо к сегодняшней дате прибавить 15 рабочих дней. При этом есть такая таблица с календарём рабочих дней:

CalendarID Year Month Day Status DateInt
2 2016 6 29 0 20160629
2 2016 6 30 0 20160630
2 2016 7 1 0 20160701
2 2016 7 4 0 20160704
2 2016 7 5 0 20160705

Соответственно могу получить 15 следующих рабочих дней вот таким запросом:

select top 15 * from tCalendarContent
where CalendarID=2
and DateInt>convert(varchar,GETDATE(),112)

Но вот как дальше из этой выборки получить максимальное или последнее значение DateInt, не используя временных таблиц я никак придумать не могу.
28 июн 16, 13:54    [19345204]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
Orlok777
Member

Откуда:
Сообщений: 3
CREATE TABLE Animal
(
ID int IDENTITY(1,1),
AnimalName nvarchar (20) NOT NULL,
Age char (2) NOT NULL,
BreedOfAnimal nvarchar (15) NOT NULL,
)
GO

ALTER TABLE Animal
ADD CONSTRAINT PR_Animal_ID PRIMARY KEY CLUSTERED (ID)
GO



ALTER TABLE Animal
ADD UserID int NULL
GO

INSERT Animal
(AnimalName, Age, BreedOfAnimal)
VALUES
( 'Джеси', '7', 'Колли'),
( 'Сам', '12', 'Дог'),
( 'Арчи', '5', 'Мопс'),
( 'Вики', '10', 'Пудиль'),
( 'Питер', '7', 'Шпиц'),
( 'Боб', '1', 'Питбуль'),
( 'Цезарь', '5', 'Шарпей'),
( 'Марти', '3', 'Чихуахуа'),
( 'Шарик', '11', 'Овчарка'),
( 'Люси', '2', 'Пудиль')
GO

ALTER TABLE Animal
ADD CONSTRAINT PR_Animal_12344 FOREIGN KEY (UserID) REFERENCES OwnersOfAnimals (UserID)
ON UPDATE CASCADE
ON DELETE CASCADE
GO


------------------------------------------



CREATE TABLE OwnersOfAnimals
(
UserID int IDENTITY(1,1),
Name nvarchar (10) NULL,
Surname nvarchar (15) NULL
)
GO


ALTER TABLE OwnersOfAnimals
ADD CONSTRAINT PR_OwnersOfAnimals_UserID PRIMARY KEY CLUSTERED (UserID)
GO

INSERT OwnersOfAnimals
(Name, Surname)
VALUES
( 'Петр', 'Петров'),
( 'Семен', 'Семенов'),
( 'Дмитрий', 'Дмитриев'),
( 'Филип', 'Филипов'),
( 'Константин', 'Сергееев'),
( 'Николаей', 'Васильков'),
( 'Виктор', 'Доужинин'),
( 'Александр', 'Александров'),
( 'Виктория', 'Смирнова'),
( 'Людмила', 'Иванова')
GO


---SELECT OwnersOfAnimals.UserID, Name, Surname, AnimalName, BreedOfAnimal, Age
---FROM OwnersOfAnimals JOIN Animal ON OwnersOfAnimals.UserID = Animal.UserID;


o Выбор всех имен питомцевс указанием имени их владельцев;
o Для всех питомцев, у которыхвозраст больше 10 лет, изменить возраст на год больше;
o Выбрать всех владельцев, у которых нет питомцев.
28 июн 16, 15:21    [19345930]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
i-i
Guest
Midaff,

declare @i int

select top 15 @i= DateInt from tCalendarContent
where CalendarID=2
and DateInt>convert(varchar,GETDATE(),112)
order by DateInt

select @i
28 июн 16, 22:11    [19347663]     Ответить | Цитировать Сообщить модератору
 Re: Select from select  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Midaff
День добрый,

У меня вопрос по сути по той же теме но предложенными вариантами я его реализовать не смог.
В моём случае суть задачи такая:
Необходимо к сегодняшней дате прибавить 15 рабочих дней. При этом есть такая таблица с календарём рабочих дней:

CalendarID Year Month Day Status DateInt
2 2016 6 29 0 20160629
2 2016 6 30 0 20160630
2 2016 7 1 0 20160701
2 2016 7 4 0 20160704
2 2016 7 5 0 20160705
Соответственно могу получить 15 следующих рабочих дней вот таким запросом:

select top 15 * from tCalendarContent
where CalendarID=2
and DateInt>convert(varchar,GETDATE(),112)

Но вот как дальше из этой выборки получить максимальное или последнее значение DateInt, не используя временных таблиц я никак придумать не могу.
пронумеруйте рабочие дни в таблице tCalendarContent по порядку, тогда чтобы получить дату через 15 рабочих дней можно найти в этой таблице текущую дату, к ее порядковому номеру прибавить 15 и искать запись с этим номером
29 июн 16, 10:04    [19348621]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить