【问题标题】:subquery or passthrough; SQL Server 2008r2子查询或直通; SQL Server 2008r2
【发布时间】:2013-06-25 23:23:25
【问题描述】:

我有一个适用于 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

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

【问题讨论】:

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


    【解决方案1】:

    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'。

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

    问候,

    【讨论】:

    • 克隆-谢谢。此代码正在运行,您发现我在原始帖子中犯的错误是正确的。我试图隐藏表名和字段名。虽然这可以正常工作,但它仍然没有给出我的 Access 前端给出的正确答案。再次感谢 - 我将在以后发布工作代码/
    • Hikerd- 你能告诉我你得到的答案和正确的答案吗?另外,ID 字段的内容是否有任何一致的结构?这可能会有所帮助。
    • 另外,您应该更改子字符串函数的参数(5 和 10)以满足您的要求。我不得不根据给定的信息猜测它们。
    • Clon-Access 正在返回“861160”,而
    • SELECT cast(SUBSTRING(ID, 5, 10)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'%oodID%') AND ISNUMERIC(SUBSTRING(tbl1.ID,5,10))=1 按预期返回 567039 行 int。
    【解决方案2】:

    试试这个

    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
    

    【讨论】:

    • 亚历山大。感谢您的代码。这仍然返回以前的错误。 “将 nvarchar 值 '188540x' 转换为数据类型 int 时转换失败。”。我目前正在研究 mods Clon 的答案。
    • +1 因为 ISNUMERIC 函数。为了更安全,我只会将 SUBSTRING(ID,5,9) 更改为 SUBSTRING(ID,5,LEN(ID)-4)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多