【问题标题】:Multiple records in SQLSQL中的多条记录
【发布时间】:2016-08-30 10:29:40
【问题描述】:

更新 首先我用过滤器 id 尝试这个 sp

select Row_number()
 OVER(ORDER BY (SELECT 1))  AS 'RowNumber',
 vf.* 
 from login ld,
 veh vf  where
(ld.fid=vf.fid) 
and ld.id = '0257'
and ld.id <> 'NA' 
and vf.CustID <> 'None'  
and vf.Simo <> 'None'  
Order by Row_number() OVER(ORDER BY (SELECT 1))

这个显示结果是这样的

RowNumber   FID     Oid     CustID      DID     Simo    RNo
1          166  MT255   M2522      1368     LM00    LE270

现在当我删除过滤器 ld.id 并尝试此操作时

select Row_number() OVER(ORDER BY (SELECT 1))  AS 'RowNumber',
 vf.* 
 from login ld,
 veh vf  where
(ld.fid = cast(vf.fid as varchar(max)))
and ld.id <> 'NA' 
and vf.CustID <> 'None' 
and vf.SimNo <> 'None'  
Order by Row_number() OVER(ORDER BY (SELECT 1))

然后这个显示多个结果

RowNumber   FID     Oid     CustID      DID     Simo    RNo
1          166    MT255   M2522      1368     LM00    LE270
2          166    MT255   M2522      1368     LM00    LE270
3          166    MT255   M2522      1368     LM00    LE270

当我删除它时

(ld.fid = cast(vf.fid as varchar(max)))

然后写这个

(ld.fid=vf.fid) 

然后这个显示错误 将 varchar 值 'none' 转换为数据类型 int 时转换失败。

更新

当我select * from Login where iD='0257' 那么

ID    FID   
0257    166 

当我尝试 select * from Login where FID='166'然后

ID          FID 
0257        166 
022         166 
0258        166

select * from Vehicle where FID='166'

FID     Oid     CustID      DID     Simo    RNo
 166  MT255   M2522      1368     LM00    LE270

【问题讨论】:

  • 为什么你加入的字段有不同的类型?
  • 您的行号使独特的无用。 Distinct 会遗漏任何重复记录,但您的行号表明您没有重复记录
  • 但是当我检查时表@GuidoG中只有记录
  • 我认为这部分有问题.. (ld.fid = cast(vf.fid as varchar(max))) 如果我们想将 ld.fid 转换为 int 那么我该怎么做..
  • 是的,但是您已将表登录与表 veh 连接起来,因此对于登录中的每条记录,您的查询将获取 veh 中的所有记录

标签: sql-server records multiple-records


【解决方案1】:

要修复转换错误,您可以试试这个
(假设 login.fid 是 varchar 字段,veh 不是 varchar 字段)

SELECT  distinct 
        vf.RegNo
FROM login ld
  inner join veh vf on ld.fid = convert(varchar, isnull(vf.fid,''))
where ld.id  <> 'NA'
AND vf.CustID  <> 'None'
AND vf.Simo  <> 'None'

编辑:好的,如果 login.fid 是 varhcar 而 vhe,fid 是 int 那么如何将 login.fid 转换为 int?

SELECT  distinct 
        vf.RegNo
FROM login ld
  inner join veh vf on convert(int, isnull(ld.fid, 0)) = vf.fid
where ld.id  <> 'NA'
AND vf.CustID  <> 'None'
AND vf.Simo  <> 'None'

如果 login.fid 中有任何不可转换为 int 的值,这将出错

编辑: 你可以尝试像这样解决这个问题,但不能保证它会一直有效。

SELECT  distinct 
        vf.RegNo
FROM login ld
  inner join veh vf on case when isnumeric(ld.fid) = 1 then convert(int, isnull(ld.fid, 0)) else -1 end = vf.fid
where ld.id  <> 'NA'
AND vf.CustID  <> 'None'
AND vf.Simo  <> 'None'

【讨论】:

  • 此答案旨在修复转换错误。如果从转换错误到多条记录并返回,我不再清楚你的问题是什么。
  • 好的,如果 login.fid 是 varhcar 而 vhe,fid 是 int 那么如何将 login.fid 转换为 int?
  • 您的编辑显示错误.. 将 varchar 值 'none' 转换为数据类型 int 时转换失败。
  • 两个表中 fid 的数据类型是什么?如果有 varchar 字段,请确保其中没有空字符串 (fid = '')。如果是后者,那么你的插入/更新软件有错误,应该禁止空字符串并修改为null
  • 登录中是否有fid字段为空字符串的记录?
【解决方案2】:

当您使用ROW_NUMBER() 时,使用 distinct 毫无意义,因为它会为每一行生成不同的值,并使 'RowNumber' 和 'RegNo' 的组合唯一。请改用以下查询来获得所需的结果。

Select Row_number() OVER (ORDER BY (SELECT 1)) AS 'RowNumber',*
   from
   (

    SELECT  distinct 
        vf.RegNo
    FROM login ld
        ,veh vf
    WHERE (ld.fid = cast(vf.fid as varchar(max)))
        AND ld.id  <> 'NA'
        AND vf.CustID  <> 'None'
        AND vf.Simo  <> 'None'

 ) tab
 ORDER BY RowNumber,
 vf.RegNo

【讨论】:

  • 我会使用左/内连接语法来代替这种过时的连接语法
  • this show error The ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。
  • 通过外部子查询移动订单。这将解决错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多