Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Помогите составить запрос  [new]
Olltroll
Member

Откуда:
Сообщений: 82
Есть 2 таблицы :

Tab1
tClientId | tAdress |
1 | XY
2 | XX
3 | YY

Tab2
 tTabId | tFromClientID | tStyle | tDate 
......| 1 | Red | 01.01.2005
......| 1 | Green | 01.03.2005
......| 2 | Red | 01.04.2005
......| 2 | Green | 01.04.2005
......| 3 | Black | 01.05.2005



между собой таблицы связываются через : tClientId = tFromClientId

Запрос должен вернуть все элементы первой таблицы, т.е. 1,2,3 , и во втором столбце запроса должна стоять дата из второй таблицы , если tStyle = Red.

Конечный результат запроса должен выглядить так :
Zapros
tClientID | tDate
1 | 01.01.2005
2 | 01.04.2005
3 | (пусто)

Как написать такой запрос ? Все происходить в Access97.
Спасибо !
21 сен 06, 15:37    [3168467]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
Ёжик`
Member

Откуда:
Сообщений: 5992
1 Query1
Select tFromClientID, tDate
From Tab2 Where tStyle = "Red";

2 Query2
Select Tab1.tClientID, Query1.tDate
From Tab1 Left Join Query1 On Tab1.tClientId = Query1.tFromClientId;
21 сен 06, 16:03    [3168704]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
andrey02
Member

Откуда:
Сообщений: 13
SELECT Tab1.tClientId, (SELECT Max(Tab2.tDate) FROM Tab2 WHERE (Tab2.tStyle="Red") AND (Tab2.tFromClientID=Tab1.tClientId)) AS MaxtDate FROM Tab1;
21 сен 06, 16:10    [3168776]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
Ёжик`
Member

Откуда:
Сообщений: 5992
andrey02
SELECT Tab1.tClientId, (SELECT Max(Tab2.tDate) FROM Tab2 WHERE (Tab2.tStyle="Red") AND (Tab2.tFromClientID=Tab1.tClientId)) AS MaxtDate FROM Tab1;

в 97 так нельзя
21 сен 06, 16:24    [3168905]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
Olltroll
Member

Откуда:
Сообщений: 82
Ёжик`
andrey02
SELECT Tab1.tClientId, (SELECT Max(Tab2.tDate) FROM Tab2 WHERE (Tab2.tStyle="Red") AND (Tab2.tFromClientID=Tab1.tClientId)) AS MaxtDate FROM Tab1;

в 97 так нельзя


да, в 97 так действительно нельзя :(

Спасибо, Ёжик, всё получилось!

А как можно в 97 первый запрос только временно создавать ?
Т.е. сейчас я пишу

strSQL = "Select tFromClientID, tDate " & _
             "From Tab2 Where tStyle = 'Red' "        
CurrentDb.QueryDefs("qry1").SQL = strSQL

но для этого у меня уже должен быть создан запрос qry1
а можно его как-нибудь не создавать ?
21 сен 06, 16:49    [3169079]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
Ёжик`
Member

Откуда:
Сообщений: 5992
Olltroll

А как можно в 97 первый запрос только временно создавать ?
Т.е. сейчас я пишу

strSQL = "Select tFromClientID, tDate " & _
             "From Tab2 Where tStyle = 'Red' "        
CurrentDb.QueryDefs("qry1").SQL = strSQL

но для этого у меня уже должен быть создан запрос qry1
а можно его как-нибудь не создавать ?


А стоит ли?
    CurrentDb.CreateQueryDef "qry1", "select ....;"
    DoCmd.DeleteObject acQuery, "qry1"
21 сен 06, 18:07    [3169541]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
4321ё
Guest
Ёжик`
andrey02
SELECT Tab1.tClientId, (SELECT Max(Tab2.tDate) FROM Tab2 WHERE (Tab2.tStyle="Red") AND (Tab2.tFromClientID=Tab1.tClientId)) AS MaxtDate FROM Tab1;

в 97 так нельзя
а почему собсно?

вы наверное не прочитали. и подумали, что это модификация вашего:
Select Tab1.tClientID, Query1.tDate
From Tab1 Left Join (Select tFromClientID, tDate
From Tab2 Where tStyle = "Red") AS Query1 On Tab1.tClientId = Query1.tFromClientId;

дык в 97 (и во 2-м) можно так
Select Tab1.tClientID, Query1.tDate
From Tab1 Left Join [Select tFromClientID, tDate
From Tab2 Where tStyle = "Red"]. AS Query1 On Tab1.tClientId = Query1.tFromClientId;
единственное препятствие - наличие служебных слов или пробелов в именовании полей для Query1 - т.к. брэккет низя совать в брэккет. (акс не поймет)

правидьно было бы так
Select Tab1.tClientID, Tab2.tDate
From Tab1 Left Join Tab2 
( On Tab1.tClientId = Tab2.tFromClientId AND  tStyle = "Red");
но тут похоже проблема у джета. (обсуждалось года 2 тому, можно найти). По крайней мере иногда приходится его обманывать:
Select Tab1.tClientID, Tab2.tDate
From Tab1 Left Join Tab2 
( On Tab1.tClientId = Tab2.tFromClientId AND  (tStyle = "Red" & IIF(Tab1.tClientId,'',''));
последнее плохо тем, что акс вынуждают вычислять константу "Red" для каждой записи Tab1. (т.е. по скорости уступает вложенному запросу)
21 сен 06, 18:54    [3169766]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
4321ё
Guest
простите, поспешил. скобку перед On в 2х последних случаях надо засунуть после

On [color=red]( [/color]Tab1.tClientId = Tab2.tFromClientId AND  tStyle = "Red");
21 сен 06, 18:58    [3169776]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
Ёжик`
Member

Откуда:
Сообщений: 5992
4321ё
Ёжик`
в 97 так нельзя
а почему собсно?
вы наверное не прочитали. и подумали, что это модификация вашего:
Прочитал - увидел вложенный запрос - вот и сказал

4321ё

дык в 97 (и во 2-м) можно так
Select Tab1.tClientID, Query1.tDate
From Tab1 Left Join [Select tFromClientID, tDate
From Tab2 Where tStyle = "Red"]. AS Query1 On Tab1.tClientId = Query1.tFromClientId;
единственное препятствие - наличие служебных слов или пробелов в именовании полей для Query1 - т.к. брэккет низя совать в брэккет. (акс не поймет)
...

Каюсь в своем незнании - проверил - действительно можно :)
22 сен 06, 09:34    [3170867]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
Ёжик`
Member

Откуда:
Сообщений: 5992
4321ё
Ёжик`
в 97 так нельзя
а почему собсно?
вы наверное не прочитали. и подумали, что это модификация вашего:
Прочитал - увидел вложенный запрос - вот и сказал

4321ё

дык в 97 (и во 2-м) можно так
Select Tab1.tClientID, Query1.tDate
From Tab1 Left Join [Select tFromClientID, tDate
From Tab2 Where tStyle = "Red"]. AS Query1 On Tab1.tClientId = Query1.tFromClientId;
единственное препятствие - наличие служебных слов или пробелов в именовании полей для Query1 - т.к. брэккет низя совать в брэккет. (акс не поймет)
...

Каюсь в своем незнании - проверил - действительно можно :)
22 сен 06, 09:36    [3170879]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить запрос  [new]
4321ё
Guest
Ёжик`
Прочитал - увидел вложенный запрос - вот и сказал
я так Вас и не понял:
Вы считаете, что использование вложенного запроса возвращающего единственное значение в качестве поля набора данных невозможно в джете 3.5 (2.5) ?
ил попросту не обратили внимания, что вложенный запрос не использован в предложении FROM, но в качестве поля? (а что так делать можно в т.ч. в 97 аксе - вы таки знаете)
22 сен 06, 11:45    [3171772]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить