0

我有一个适用于 SQL Server 2008 R2 链接表的 Access 2000 查询。我需要将其编写为视图或通过查询:

`

SELECT Max(CLng((Mid([tbl1]![ID],5)))) AS lastnumberused
FROM [tbl1]
WHERE ((([tbl1]![ID]) Like "OODD*" And ([tbl1]![ID]) Not Like "OODDid*" And ([tbl1]![ID]) Not Like "*x") AND ((CLng((Mid([tbl1]![ID],5))))<1000000));

`

所以我正在寻找的是 1000000 以下的最大数字,它以 OODD% 但不是 OODDID% 开头。此外,记录不能以“x”结尾。

我在 TSQL for SQL Server 中的代码看起来像这样并且不起作用......

`

SELECT    
convert (int, (substring(tblMain.BarcodeID,5,10))) as X1, [ID]
FROM tblMain
WHERE ([tbl1]![ID] LIKE N'OODD%') 
AND ([tbl1]![ID] NOT LIKE N'%x%') 
AND ([tbl1]![ID] NOT LIKE N'OODDID%') 
Select MAX (x1)+1
from bar1
where (x1<1000000)

`

建议?谢谢,H

更新 15june2013 WITH T1 (number) AS (SELECT substring(tbl1.ID,5,10) FROM tblMain AS tbl1 WHERE (ID LIKE N'oodd%') AND (ID NOT LIKE N'%x%') AND (ID NOT LIKE N'ooddID%')) SELECT (cast((number)as int)) FROM T1 这有效并返回 561770 行。

With T1(number) as(SELECT cast(SUBSTRING(ID, 5, 7)as int) FROM tblMain as tbl1 WHERE (tbl1.ID LIKE N'oodd%') AND (tbl1.ID NOT LIKE N'%x%') AND (tbl1.ID NOT LIKE N'%ooddID%') AND ISNUMERIC(SUBSTRING(tbl1.ID,5,10))=1) Select max(number) from T1 也可以,但返回一个大于 1000000 的数字

当添加 where 语句时,以下代码包含应在前一个语句中排除的记录。 With T1(number) as(SELECT cast(SUBSTRING(ID, 5, 7)as int) FROM tblMain as tbl1 WHERE (tbl1.ID LIKE N'oodd%') AND (tbl1.ID NOT LIKE N'%x%') AND (tbl1.ID NOT LIKE N'%ooddID%') AND ISNUMERIC(SUBSTRING(tbl1.ID,5,10))=1) Select max(number) from T1 where x1 <1000000

4

2 回答 2

2

WHERE 子句包含 FROM 子句中不存在的 [tbl1] 表。您应该将其更改为 tblMainBee 或在带有 AS 的 FROM 子句中添加一个“tbl1”别名。

此外,您有两个未连接的 SELECT 语句,而不是一个。同样,在第二个 SELECT 中,有一个 bar1 表没有出现在其他任何地方……对吗?

另一个错误是您不能使用“!” 分隔表名和字段名。你必须使用一个点。

最后,尝试转换数据类型时会出现问题。您不需要它,因为字符串之间的比较也有效。

您的访问 SELECT 语句要简单得多。

尝试

WITH T1(number) AS (

SELECT substring(tbl1.ID,5,LEN(tbl1.ID)-4)
FROM tblMainBee as tbl1
WHERE ([tbl1].[ID] LIKE N'OODD%')
  AND ([tbl1].[ID] NOT LIKE N'%x%')
  AND ([tbl1].[ID] NOT LIKE N'OODDID%')
  AND (IsNumeric(substring(tbl1.ID,5,LEN(tbl1.ID)-4)) = 1)
) 
SELECT max(convert(bigint,number)) FROM T1 WHERE number < 1000000;

第二种类型转换是隐式的,因为 1000000 是数字。第一个是必须的。否则,它会认为“12346”大于“123421”。

字符串之间的比较仅在它们具有固定长度时才有效。

问候,

于 2013-06-26T07:53:53.197 回答
1

尝试这个

select MAX(CAST(SUBSTRING(ID,5,9) as INT))+1
from tblMainBee
where
    ID Like 'OODD%'
    AND ID Not Like 'OODDid%'
    AND ID Not Like '%x'
    AND ISNUMERIC(SUBSTRING(ID,5,9))=1
    AND CAST(SUBSTRING(ID,5,9) as INT)<1000000
于 2013-06-26T07:58:13.973 回答