子查询或直通; SQL Server 2008r2

时间:2013-06-25 23:23:26

标签: sql-server-2008 tsql ms-access subquery

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

`

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

2013年6月15日更新 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

2 个答案:

答案 0 :(得分:2)

WHERE子句包含一个[tbl1]表,该表在FROM子句中不存在。您应该将其更改为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”。

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

此致

答案 1 :(得分: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