#sql #casting #temp-tables #nested-queries
Вопрос:
SELECT
CAST([patientDATA] AS XML).value('PatientcardCard[1]/Replacements[1]/patientId[1]', 'nvarchar(80)') [patientId]
,* into #tmp
FROM hospital [c1] with(NOLOCK)
where
patientserial in (
select ptserial From patients with(Nolock)
where patientsid=6889
and patientprogramid in (
26917,
21296,
27025
)
)
select patientId,patientbarcode,patientprogramID
into #tmp1
From #tmp
join patients with(nolock) on patientserial=ptserial
where patientid in
('0401478300007847',
'0401478300008566',
'0401478300008761',
'0401478300008727',
'0401478300007648',
'0401478300008020'
)
Итак, первый запрос использует приведение для получения значения из тега внутри столбца, тегом является PatientID, и он хранит данные во временной таблице.
Второй запрос — это извлечение данных из временной таблицы. Я хочу написать вложенный запрос без использования временной таблицы. Но я сохраняю синтаксическую ошибку, это мой запрос до сих пор:
select patientId,patientbarcode,patientprogramID
From (
SELECT
CAST([patientDATA] AS XML).value('PatientcardCard[1]/Replacements[1]/patientId[1]', 'nvarchar(80)') [patientId]
,* into #tmp
FROM hospital [c1] with(NOLOCK)
where
patientserial in (
select ptserial From patients with(Nolock)
where patientsid=6889
and patientprogramid in (
26917,
21296,
27025
)
)
)
join patients with(nolock) on patientserial=ptserial
where patientid in
('0401478300007847',
'0401478300008566',
'0401478300008761',
'0401478300008727',
'0401478300007648',
'0401478300008020'
)
Моя ошибка в SQL:
invalid column in first line, around patientId,patientbarcode
and in join part, invalid column as ptserial
Это потому, что значение приведено?
Ответ №1:
С вашим подходом есть некоторые проблемы.
SELECT *
это не очень хорошая идея. Это также кажется ненужным для вашего окончательного запроса.- Вы должны указать, из какой таблицы берется каждый столбец.
- Возможно, вы слишком много думаете об этом.
SELECT CAST([patientDATA] AS XML).value('PatientcardCard[1]/Replacements[1]/patientId[1]', 'nvarchar(80)') [patientId]
, patientbarcode
, patiendprogramID
FROM hospital h
INNER JOIN patients p ON p.ptserial = h.patientserial
WHERE patientsid = 6889
AND patientprogramid IN (26917, 21296, 27025)
AND patientid IN (
'0401478300007847'
,'0401478300008566'
,'0401478300008761'
,'0401478300008727'
,'0401478300007648'
,'0401478300008020'
)
Комментарии:
1. Я все еще получаю недопустимую ошибку в идентификаторе пациента(последние строки), это потому, что я привел эти данные?
2. Я не знаю, что такое «недопустимая ошибка». Вы имеете в виду недопустимую ссылку на столбец или что-то в этом роде? Тебе не
AND patientid IN
следовало этого делать . Вы должны ссылаться на псевдоним таблицы, напримерAND p.patientid IN
. Я этого не сделал, потому что не знаю, какая таблица содержит какие столбцы, потому что вы не предоставили эту информацию.