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

Откуда:
Сообщений: 10
Ребятки, подскажите новичку!
Нужно сделать вложенный запрос (именно эта конструкция).
Есть 2 таблицы - доктора и лекарства, связь через доп. табличку. Все инсерты вбиты правильно, обычные запросы идут на "ура" :)
Пытаюсь написать следующее:

/* Выдать фамилии врачей, которые назначили лекарство "АРБИДОЛ"*/
SELECT DOCTORS.SURNAME_D
FROM DOCTORS
WHERE DOCTORS.DOCTOR_ID
IN
(SELECT DRUGS.NAME_DRUG
FROM DRUGS
WHERE DRUGS.NAME_DRUG='АРБИДОЛ');

SQL ругается:
Сообщение 245, уровень 16, состояние 1, строка 2
Ошибка преобразования значения nvarchar "АРБИДОЛ

В чем проблема?
28 мар 13, 21:02    [14109929]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
samoxod
Member

Откуда: Москва
Сообщений: 31
Ритка-Маргаритка,

Без описания полей таблиц не просто ответить правильно, но ...
Судя по всему DOCTORS.DOCTOR_ID - это идентификатор доктора
Если он должен быть IN(...), то "вложенный запрос" должен возвращать НАБОР ИДЕНТИФИКАТОРОВ ДОКТОРОВ
А тут он вроде как возвращает набор наименований лекарств?
28 мар 13, 21:07    [14109962]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Ритка-Маргаритка
Member

Откуда:
Сообщений: 10
Честно говоря, я вообще немного не догоняю, зачем эти вложенные запросы нужны, поэтому мне непонятно, кто кого возвращает :(

Вот инсерты:

INSERT INTO DOCTORS VALUES (1, 'ИВАНОВ', 'ГЕННАДИЙ', 'АРКАДЬЕВИЧ', '1/12/1976', 4951583405, 6);
INSERT INTO DOCTORS VALUES (2, 'СТЕПАНОВ', 'ВАСИЛИЙ', 'ИЛЬИЧ', '14/03/1956', 4952663454, 1);
INSERT INTO DOCTORS VALUES (3, 'ВАСИЛЬЕВА', 'ВЕРА', 'СЕРГЕЕВНА', '11/06/1980', 4991801734, 1);
INSERT INTO DOCTORS VALUES (4, 'ЛЕБЕДЕВА', 'ТАТЬЯНА', 'ПАВЛОВНА', '02/12/1948', 4956778834, 5);
INSERT INTO DOCTORS VALUES (5, 'КУТИЛКИНА', 'АННА', 'АЛЕКСЕЕВНА', '06/04/1977', 4998806754, 12);
INSERT INTO DOCTORS VALUES (6, 'РАСИМОВ', 'ГЕОРГИЙ', 'АРТУРОВИЧ', '08/09/1985', 4996897722, 12);
INSERT INTO DOCTORS VALUES (7, 'АРТЕМЬЕВА', 'ВИТАЛИНА', 'СЕМЕНОВНА', '07/07/1977', 4957725690, 11);
INSERT INTO DOCTORS VALUES (8, 'СЕРГЕЕВА', 'ОЛЬГА', 'НИКОЛАЕВНА', '14/07/1956', 4998805032, 6);

INSERT INTO DRUGS VALUES (1, 'АНТИГРИППИН');
INSERT INTO DRUGS VALUES (8, 'АРБИДОЛ');
INSERT INTO DRUGS VALUES (12, 'КОРВАЛОЛ');
INSERT INTO DRUGS VALUES (5, 'ДИГОКСИН');
INSERT INTO DRUGS VALUES (25, 'КАПТОПРИЛ');
INSERT INTO DRUGS VALUES (37, 'ОТИПАКС');
INSERT INTO DRUGS VALUES (24, 'ОФЛОМАК');
INSERT INTO DRUGS VALUES (21, 'БРОМГЕКСИН');
INSERT INTO DRUGS VALUES (2, 'АМБРОБЕНЕ');
INSERT INTO DRUGS VALUES (9, 'ТЕОФИЛЛИН');
INSERT INTO DRUGS VALUES (19, 'ИНТАЛ');
INSERT INTO DRUGS VALUES (10, 'БЕТАСЕРК');
INSERT INTO DRUGS VALUES (22, 'КАЛИНОР');
INSERT INTO DRUGS VALUES (30, 'АЦИЛАКТ');

А вот развязочная таблица, здесь еще поле с id пациента, но его в данном запросе не учитываем:
INSERT INTO PRESCRIPTION VALUES (2, 123, 1);
INSERT INTO PRESCRIPTION VALUES (1, 108, 12);
INSERT INTO PRESCRIPTION VALUES (5, 14 ,37);
INSERT INTO PRESCRIPTION VALUES (2, 365, 21);
INSERT INTO PRESCRIPTION VALUES (6, 19, 9);
INSERT INTO PRESCRIPTION VALUES (8, 186, 5);
INSERT INTO PRESCRIPTION VALUES (2, 204, 21);
INSERT INTO PRESCRIPTION VALUES (8, 104, 25);
INSERT INTO PRESCRIPTION VALUES (6, 226, 19);
INSERT INTO PRESCRIPTION VALUES (5, 5, 10);
INSERT INTO PRESCRIPTION VALUES (6, 102, 37);
INSERT INTO PRESCRIPTION VALUES (4, 413, 22);
INSERT INTO PRESCRIPTION VALUES (7, 11, 30);
INSERT INTO PRESCRIPTION VALUES (3, 199, 2);
INSERT INTO PRESCRIPTION VALUES (3, 58, 8);
INSERT INTO PRESCRIPTION VALUES (5, 13, 9);
INSERT INTO PRESCRIPTION VALUES (4, 276, 22);
INSERT INTO PRESCRIPTION VALUES (4, 7, 22);
INSERT INTO PRESCRIPTION VALUES (7, 288, 30);
INSERT INTO PRESCRIPTION VALUES (5, 87, 24);
INSERT INTO PRESCRIPTION VALUES (2, 87, 1);
INSERT INTO PRESCRIPTION VALUES (3, 102,8);
INSERT INTO PRESCRIPTION VALUES (5, 87, 10);
INSERT INTO PRESCRIPTION VALUES (6, 365,19);
INSERT INTO PRESCRIPTION VALUES (2, 102,21);
INSERT INTO PRESCRIPTION VALUES (5, 413,37);[b][/b]
28 мар 13, 21:13    [14109983]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
samoxod
Member

Откуда: Москва
Сообщений: 31
Ритка-Маргаритка,
Ну и что здесь что? Описание полей так и не дано...
Допустим, что DOCTOR_ID - это поле типа INT
Ошибка в том, что подзапрос возвращает набор строк(наименований препаратов), а совпадение ищется с типом INT

/*Выдать фамилии врачей, которые назначили лекарство "АРБИДОЛ"*/
SELECT D.SURNAME_D
FROM DOCTORS D
WHERE D.DOCTOR_ID IN(
SELECT P.DOCTOR_ID FROM PRESCRIPTION P
INNER JOIN DRUGS DR ON P.DRUG_ID = DR.DRUG_ID
WHERE DR.NAME_DRUG = 'АРБИДОЛ'
)
28 мар 13, 22:31    [14110180]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Ритка-Маргаритка, вы хочите вложенный запрос? Их есть 2 штуки:)
select (select SURNAME_D from DOCTORS where DOCTOR_ID=p.DOCTOR_ID)SURNAME_D
from PRESCRIPTION p
where exists(select ID_DRUG from DRUGS where ID_DRUG=p.ID_DRUG and NAME_DRUG='АРБИДОЛ')
28 мар 13, 23:19    [14110308]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить