2

かなり複雑な 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'

2 番目のクエリを変更して * from S_analysis WHERE heat_no = 'A7M0066' だけでなく、その heat_no を含まないレコードを含むすべてのレコードも含める必要があります。ここで、analysis_datetime は、最初のクエリの最後のレコードの分析時間と、その時間に続く 2 時間の間です。 .

2 番目のクエリの 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)
4

2 に答える 2

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 ))
于 2013-04-25T02:51:53.370 に答える