2013-04-25 4 views
2

Im пытается написать то, что я считаю довольно сложным SQL-запросом, но Im работает с ограниченными знаниями SQL. У меня есть этот запрос:Сложный запрос Ограниченные знания SQL

SELECT 
    analysisvalue.analysisid, 
    heatname, 
    analysistime, 
    sampletype, 
    grade, 
    productid, 
    element, 
    value 
FROM 
    dbo.AnalysisValue 
INNER JOIN 
    dbo.CAnalysis 
ON 
    dbo.AnalysisValue.AnalysisID = dbo.CAnalysis.AnalysisID 
WHERE 
    heatname = 'A7M0066' 
ORDER BY 
    analysisvalue.analysisid ASC, 
    element 

и этот запрос:

SELECT 
    * 
FROM 
    S_analysis 
WHERE 
    heat_no = 'A7M0066' 

Мне нужно изменить второй запрос также включают в себя * от S_analysis WHERE heat_no = «A7M0066», но и все записи в том числе и без того heat_no где analysis_datetime находится между временем анализа последней записи из первого запроса и двумя часами, которые следуют за этим временем.

Структура таблицы S_analysis для второго запроса:

analysis_datetime(datetime, not null) 
heat_no(varchar(7), not null) 
comment(varchar(40), null) 
Then about 30 other columns of type (real, null) 

Структура таблицы AnalysisValue в первом запросе:

AnalysisID(int, not null) 
Element(char(9), not null) 
Value(real, null) 

Структура таблицы CAnalysis в первом запросе:

AnalysisID(PK, int, not null) 
HeatName(char(7), null) 
AnalysisTime(datetime, null) 
SampleType(char(5), null) 
Grade(char(4), null) 
ProductID(char(14), null) 
+0

Просьба включить структуру таблицы – praveen

+1

@praveen Я добавил таблица структуры выше – HendPro12

ответ

0

Поскольку вам нужен только верхний ряд от вашего первого запроса. Вы можете использовать Cross join со 2-го запроса, чтобы получить желаемый результат

;with cte as 
(SELECT 
analysisvalue.analysisid, 
heatname, 
analysistime, 
sampletype, 
grade, 
productid, 
element, 
value 
FROM 
dbo.AnalysisValue 
INNER JOIN 
dbo.CAnalysis 
ON 
dbo.AnalysisValue.AnalysisID = dbo.CAnalysis.AnalysisID 
WHERE 
heatname = 'A7M0066' 
) 
SELECT 
     * 
FROM 
S_analysis s 
CROSS JOIN (SELECT TOP 1 analysistime 
FROM cte 
ORDER BY analysisid desc 
) c 
WHERE s.heat_no = 'A7M0066' OR 
(s.analysis_datetime BETWEEN c.analysistime AND DATEADD(hh, 2, c.analysistime)) 
+0

Спасибо за помощь, но я не уверен, что вы имеете в виду, мне нужна только одна строка из моего первого запроса. Первый запрос, который я разместил выше, возвращает в настоящее время более 150 строк, что является правильным. Я попробую ваше решение – HendPro12

+0

Im в настоящее время принимает эти ошибки: Msg 156, уровень 15, состояние 1, строка 1 Неверный синтаксис рядом с ключевым словом «WITH». Msg 156, Level 15, State 1, Line 19 Неверный синтаксис рядом с ключевым словом «ORDER». – HendPro12

+0

use ';' before' With' statement – praveen

0

Попробуйте это (никогда не использовал sql-server, но она должна производить свои ожидаемые результаты)

SELECT 
    * 
FROM 
    S_analysis 
    CROSS JOIN 
    ( 
    SELECT TOP 1 
     analysistime 
    FROM 
     dbo.CAnalysis 
    WHERE 
     heatname = 'A7M0066' 
    ORDER BY 
     analysistime DESC) c 
WHERE 
    heat_no = 'A7M0066' 
    OR (heat_no IS NULL AND s.analysis_datetime BETWEEN c.analysistime AND DATEADD(hh, 2, c.analysistime)) 
+0

Строка 15: Неправильный синтаксис рядом с «LIMIT». – HendPro12

+0

@ HendPro12 Я не тестировал его, могут быть некоторые основные ошибки синтаксиса, но логика должна быть хорошей – Akash

+0

@ HendPro12 Я попытался исправить синтаксис, пожалуйста, chk now – Akash