Sql server SQL逻辑问题和表的重命名
我这里有两个问题,我想检查我的表Source\u Patient中是否有任何记录在Batch.SourceId=1的情况下将IsProcessed列计算为true ,当Batch.SourceId=2时,我想检查相同的,但在表Plain\u Data中,如果Plain\u Data有任何列IsProcessed的记录计算为true Plain\u Data.IsProcessed=1。与查询相关的另一个问题是如何重命名案例中的表Sql server SQL逻辑问题和表的重命名,sql-server,case,Sql Server,Case,我这里有两个问题,我想检查我的表Source\u Patient中是否有任何记录在Batch.SourceId=1的情况下将IsProcessed列计算为true ,当Batch.SourceId=2时,我想检查相同的,但在表Plain\u Data中,如果Plain\u Data有任何列IsProcessed的记录计算为true Plain\u Data.IsProcessed=1。与查询相关的另一个问题是如何重命名案例中的表 这是我到目前为止所做的,但它不起作用,我在关键字“FROM”附近得
这是我到目前为止所做的,但它不起作用,我在关键字“FROM”附近得到了错误语法,但我猜错误相当普遍,查询构造不好,我还附加了数据模型: 查询 数据模型
我发现你的语法有很多问题。。。试试这个,看看是否适合你。我在这里遇到的唯一问题是,您需要将子查询与当前记录ID关联起来。但我希望这为您指明了正确的方向
SELECT
B.Id AS BatchId,
S.Id AS SourceId ,
S.Label AS SourceLabel,
B.Number AS BNumber,
RD.Id AS RawDataId,
(CASE
WHEN B.SourceId = 1 THEN
(SELECT TOP 1 Case When ISNULL(SP1.IsProcessed,0) = 1 Then 1 Else 0 END FROM Source_Patient SP1 Where SP1.IsProcessed = 1 AND SP1.BatchID = SP.BatchID)
WHEN B.SourceId = 2 THEN
(SELECT TOP 1 Case When ISNULL(PD1.IsProcessed,0) = 1 Then 1 Else 0 END FROM Plain_Data PD1 Where PD1.IsProcessed = 1 AND PD1.RawDataID = ISNull(PD.RawDataID,0)) ELSE 0 END
) AS IsProcessed
FROM Batch B
LEFT JOIN RawData RD ON B.Id = RD.BatchId
LEFT JOIN Plain_Data PD ON RD.Id = PD.RawDataId
INNER JOIN Source_Patient SP ON SP.BatchId=B.Id
INNER JOIN Source S ON B.SourceId = S.Id
不工作并不意味着什么。请解释问题所在。关键字“FROM”附近的语法不正确。但是我相信这个错误是非常普遍的,我认为查询本身是不正确的,我猜你能把嵌套的case语句移到前面的select列表中,看看你是否会遇到同样的错误吗?然后编辑您的问题并添加错误。这当然毫无意义:从Source_Patient.IsProcessed=1中选择TOP 1。我猜这个嵌套案例中的问题在某个地方。尝试删除它,看看错误是否消失。关键字“FROM”附近的语法不正确。关键字“FROM”附近的语法不正确。关键字“FROM”附近的语法不正确。那么…3次相同的错误现在你说的与当前记录ID相关是什么意思?因此,您的查询类似于如果Batch.DataSource=1,那么如果这个SELECT TOP 1 IsProcessed FROM Source\u Patient其中IsProcessed=1返回一个值,那么它将计算为true?你的未来会发生什么?我不明白第一条。基本上,我不确定是否选中SELECT TOP 1 IsProcessed FROM Source_Patient,其中IsProcessed=1为假,它将计算下一个WHEN Batch.SourceId=2…我得到的错误是关键字“WHEN”附近的语法不正确。关键字“ELSE”附近的语法不正确。我试图使用Select语句获取位的值,1或0。查看更新是否有效。由于我的数据模型,我想知道是否选择前1个IsProcessed FROM Plain_Data,其中IsProcessed=1我的查询使用此左键连接RawData上的Plain_数据来识别Plain_数据表。Id=Plain_Data.rawdataid回答您的问题。。。您正在为整个表选择顶部1,其中IsProcessed=1。这就是你想要的吗?还是希望它基于BatchID或RawDataID进行选择?
Batch
Id
SourceId (FK) - table Source
Number
Code
StartedAt
EndedAt
RawData
id
SourceId (FK) - table Source
BatchId (FK) - table Batch
CreatedAt
Source_Patient
Id
BatchId (FK) - table Batch
PatientId
NameFirst
NameLast
IsProcessed (Boolean)
Plain_Data
Id
RawDataId (FK) - table RawData
FirstName
LastName
IsProcessed (Boolean)
Source
Id
Label
SELECT
B.Id AS BatchId,
S.Id AS SourceId ,
S.Label AS SourceLabel,
B.Number AS BNumber,
RD.Id AS RawDataId,
(CASE
WHEN B.SourceId = 1 THEN
(SELECT TOP 1 Case When ISNULL(SP1.IsProcessed,0) = 1 Then 1 Else 0 END FROM Source_Patient SP1 Where SP1.IsProcessed = 1 AND SP1.BatchID = SP.BatchID)
WHEN B.SourceId = 2 THEN
(SELECT TOP 1 Case When ISNULL(PD1.IsProcessed,0) = 1 Then 1 Else 0 END FROM Plain_Data PD1 Where PD1.IsProcessed = 1 AND PD1.RawDataID = ISNull(PD.RawDataID,0)) ELSE 0 END
) AS IsProcessed
FROM Batch B
LEFT JOIN RawData RD ON B.Id = RD.BatchId
LEFT JOIN Plain_Data PD ON RD.Id = PD.RawDataId
INNER JOIN Source_Patient SP ON SP.BatchId=B.Id
INNER JOIN Source S ON B.SourceId = S.Id