Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
marianna

Sql запрос (выборка)

22.07.2010, 12:29. Показов 1863. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В картотеке есть условно “колхозники” и ”совхозники” – tblkart (id, fam, im, kateg), поле kateg – Категория, integer (1), значение kateg 1 – колхозник, 2 – совхозник.
Подчиненная таблица удостоверений – tbllic (id, idlic, vid, ser, nom), в которой хранятся разные удостоверения по видам (vid – string 3)
Мне нужно выбрать всех «колхозников», и если есть, серии и номера удостоверений, где vid= “У03”. если соотв удостоверения нет, вывести фамлию и имя, а колонка с удост. должна остаться пустой.
Запрос ниже игнорирует всех тех, у кого в tbllic нет записей. Что делать?
SQL
1
SELECT tblkart.fam,tblkart.im, tbllic.ser,tbllic.nom FROM tblkart LEFT OUTER JOIN tbllic ON tblkart.id=tbllic.id WHERE kateg = 1 AND tbllic.vid = 'У03'
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2010, 12:29
Ответы с готовыми решениями:

Вложенный SQL-запрос, выборка
Подскажите пожалуйста, что ни так? Делаю запрос на выборку, и, Вот так работает: 'Select Холодная_Вода from счет where Дата in (SELECT...

SQL запрос выборка, помогите составить
есть таблица в ней два поля: первое id, второе id_code Вот примерно такая таблица id id_code 1 2 1 1 1 3

SQL Запрос, выборка повторяющихся значений
Добрый день. Не получается создать запрос, бьюсь несколько дней. На первый взгляд кажется все просто, но упираюсь в стену. Общая...

16
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
22.07.2010, 13:05
похоже что нужно применять union
0
marianna
22.07.2010, 14:47
union, на сколко я знаю, объединяет таблицы с одинаковыми полями, отбрасывая дубли. Вот из MSDN пример
Code
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
For example, Table1 and Table2 have the same two-column structure.
 
Table1     Table2   
ColumnA ColumnB     ColumnC ColumnD 
char(4) int   char(4) int 
------- ---   ------- --- 
abc 1   ghi 3 
def 2   jkl 4 
ghi 3   mno 5 
 
 
This query creates a UNION between the tables:
 
SELECT * FROM Table1
UNION
SELECT * FROM Table2
 
Here is the result set:
 
ColumnA  ColumnB
-------  --------
abc      1
def      2
ghi      3
jkl      4
mno      5
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
22.07.2010, 16:10
не совсем точно,
можно и так делать
SQL
1
2
3
SELECT field1, field2 FROM table1
UNION 
SELECT field3, field4 FROM table2
главное, чтобы типы и кол-во полей совпадали

В твоем случае это как раз и нужно. В первом запросе выбираешь своих всех «колхозников», и если есть, серии и номера удостоверений, где vid= “У03”.
Во втором, если соотв удостоверения нет, вывести фамлию и имя, а колонка с удост. пустая.
0
98 / 1 / 1
Регистрация: 28.01.2007
Сообщений: 53
22.07.2010, 17:03
Или так:
select tblkart.fam,tblkart.im, tbllic.ser,tbllic.nom from tblkart left outer join tbllic on tblkart.id=tbllic.id and kateg = 1
0
marianna
25.07.2010, 10:50
Составила схему и вот что у меня получилось.
Теперь я хочу усложнить запрос и выбрать только те удостоверения, которые имеют последнюю дату выдачи, чтобы Сидоров был один, как во 2 запросе и Чернов без удостоверения остался, как в 1. У кого есть лишняя минута, помогите, пожалуйста. Я что-то уже плаваю вокруг и около, но в цель не попадаю.

Code
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
table1                  table2
id   fam     kateg      id vid  ser nom dat_v
1   Иванов    1       1  У01 К  2000    08/12/2002
2   Петров    2       1  У03 С  50  02/02/2003
3   Сидоров  1       2  У03 А  600 02/01/2004
4   Чернов    1       3  У03 T   700 03/02/2000
                                3  У03 Т       333     09/24/2004
 Запрос № 1
select table1.fam, table2.ser, table2.nom from table1 left outer join table2 on table1.id=table2.id and table2.vid ='У03'  where table1.kateg = 1 order by table1.fam
 
Результат  Запроса № 1
 
Id      fam     ser nom
1   Иванов        С  50
3   Сидоров          T   700
3   Сидоров          Т  333
4   Чернов        -   -
 
 Запрос № 2
select table1.id, table1.fam, max(table2.dat_v) as maxdat_v from table1 inner join table2 on table1.id=table2.id and table2.vid ='У03' where table1.kateg = 1 group by table1.id, table1.fam order by table1.fam
 
Результат  Запроса № 2 по датам
id          fam                  maxdat_v                    
----------- -------------------- --------------------------- 
1           Иванов               2002-12-08 00:00:00
3           Сидоров              2004-09-03 00:00:00
 
(2 row(s) affected)
 
Запрос № 3 - ?????
 
Желаемый результат Запроса № 3 
Id      fam     ser nom maxdat_v                    
1   Иванов        С  50  2002-12-08 00:00:00 
3   Сидоров          Т  333     2004-09-03 00:00:00
4   Чернов        -   -
marianna
25.07.2010, 10:52
Строки немного поехали
98 / 1 / 1
Регистрация: 28.01.2007
Сообщений: 53
25.07.2010, 14:00
Select * from table1 left join table2 on table1.id = table2.id and table1.kateg = 1 and table2.ser = 'УО3' and table2.dat_v=(Select max(Dat_v) from table2 t2 where t2.id = table1.id)
0
marianna
25.07.2010, 14:31
VbGuest
Уже ближе к истине,
Code
1
Select table1.fam, table2.ser, table2.nom from table1 left join table2 on table1.id = table2.id and table2.ser = 'УО3' and table2.dat_v=(Select max(Dat_v) from table2 t2 where t2.id = table1.id) where table1.kateg = 1
Запрос не выдает номера и серии удостоверений
Результат
Code
1
2
3
4
5
fam                  ser  nom    
-------------------- ---- ------ 
Иванов               NULL NULL
Сидоров              NULL NULL
Чернов               NULL NULL
(3 row(s) affected)
98 / 1 / 1
Регистрация: 28.01.2007
Сообщений: 53
25.07.2010, 15:06
А так:
table2.dat_v=(Select max(Dat_v) from table2 t2 where t2.id = table1.id and t2.ser = 'УО3')
0
marianna
25.07.2010, 15:11
И так не выдает, и никак. Все не так просто. М.б. union все-таки надо применять. или одним запросом не обойтись, нужно как-то обрабатывать базы, использовать доп. таблицы или массивы.
98 / 1 / 1
Регистрация: 28.01.2007
Сообщений: 53
25.07.2010, 15:14
Даже если ser с vid поменять, а то я невнимательно посмотрел
0
marianna
25.07.2010, 15:32
На это я обратила внимание, у меня была др. ошибка, но сейчас все OK
Спасибо большое!
Code
1
Select table1.fam, table2.ser, table2.nom from table1 left outer join table2 on table1.id = table2.id  and table2.dat_v=(Select max(Dat_v) from table2 t2 where t2.id = table1.id and t2.vid ='У03') where table1.kateg = 1
marianna
25.07.2010, 17:04
В реальной жизни все не так, как в схемах. Я рано радовалась.
Бывает так, что номер и серия заполнена, а даты нет - Null (в table2 id = 4),
тогда результат тот же -
Code
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
table2
id  vid ser nom dat_v
1   У01    К  2000      01/01/2003
1   У03    С  50  02/02/2003
2   У03    А  600 02/01/2004
3   У03    T   700 03/02/2000
3   У03    Т  333 01/09/2004
4       У03     Е       555     null 
 
fam                  ser  nom    
-------------------- ---- ------ 
Иванов               С    50
Сидоров              У    333
Чернов               NULL NULL
 
а должен быть
 
(3 row(s) affected)
 
fam                  ser  nom    
-------------------- ---- ------ 
Иванов               С    50
Сидоров              У    333
Чернов               Е    555
 
(3 row(s) affected)
marianna
25.07.2010, 17:12
Получилось. Поставила 'or table2.dat_v is null '
98 / 1 / 1
Регистрация: 28.01.2007
Сообщений: 53
25.07.2010, 17:45
При большом кол-ве записей в table2 понадобится индек по полю dat_v
0
marianna
26.07.2010, 17:05
Я уже работаю с большими базами без индекса. Индекс надо заводить в базе SQL Servera? Вообще не использую индексы. Индексы для меня загадка, использую только order by, ни в одной моей книге ничего путного про них нет, кроме как создать.
Выдается не совсем правильный набор, т.е. есть такое
Code
1
2
3
id fam     nom   dat_v
1  Иванов  3456  12/12/2004
1  Иванов  12345 Null
НО таких дублей немного, я решила выбрасывать это все в таблицу, в ней делать зачистку на дубли, и получать то, что нужно для отчета. Не получилось одним запросом, хотя наверно можно.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.07.2010, 17:05
Помогаю со студенческими работами здесь

Выборка данных через SQL запрос
Доброго времени суток...Есть база данных. Пользователь вводит данные, регистрируется, потом авторизовавшись проходит в личный кабинет там...

Выборка данных в случайном порядке SQL запрос
Необходима ваша помощь в формировании SQL запроса на выборку всех данных из таблицы в случайном порядке, а именно: 1. Вытаскивать...

Delphi. SQL запрос ADOQuery. Выборка из Dbgrid в разных формах
помогите! не понимаю как сделать то что задумала. Есть таблица Курс (код, курс) и предметы(код, КодСтудента, кодДисциплины, кодСеместра,...

SQL запрос: выборка групп, которые учатся в определенном учебном году
Ситуация такая, у меня есть база в Access, подключение adoconnection, datasourse, adoquery. Нужно составить запрос на выборку групп,...

Как сделать запрос, так чтобы выборка проходила на стороне SQL сервера?
Помогите переделать запрос, так чтобы не грузились все данные: IAsyncEnumerable<MessageInfo> message =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru