【问题标题】:SQL Sub-Select using primary Key使用主键的 SQL 子选择
【发布时间】:2014-12-20 03:22:24
【问题描述】:

我正在寻找从行集上的子选择查询中检索值,其中我只想要主查询的当前行中的值(SQL Server 版本 2005-2012 显示了相同的行为)。我编写了一个返回多行的子选择查询(HOW,我在主键上匹配?!)

以下示例代码说明了我要完成的工作:

CREATE TABLE [dbo].[TestTable]
(
    [TestID] [int] IDENTITY(1,1) NOT NULL,
    [TestValue] [nvarchar](255) NULL,
    [TestValue2] [nvarchar](255) NULL,
    [TestValue3] [nvarchar](255) NULL,
    [TestValue4] [nvarchar](255) NULL,

    PRIMARY KEY CLUSTERED ([TestID] ASC)
         WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
               ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

INSERT INTO [TESTDB].[dbo].[TestTable] ([TestValue], [TestValue2], [TestValue3],[TestValue4])
VALUES('01234', '56789', '98765', '43210')
GO

INSERT INTO [TESTDB].[dbo].[TestTable] ([TestValue], [TestValue2], [TestValue3],[TestValue4])
VALUES('01234', '98765', '56789', '43210')
GO

INSERT INTO [TESTDB].[dbo].[TestTable] ([TestValue], [TestValue2], [TestValue3],[TestValue4])
VALUES('01234', '43210', '56789' ,'98765')
GO

INSERT INTO [TESTDB].[dbo].[TestTable] ([TestValue], [TestValue2], [TestValue3],[TestValue4])
VALUES('01234', '98765', '43210', '56789')
GO

SELECT TOP 1000 
     [TestID]
    ,[TestValue]
    ,[TestValue2]
    ,[TestValue3]
    ,(SELECT TestValue + TestValue2 AS CompositeValue 
      FROM [TESTDB].[dbo].TestTable AS foo 
      WHERE foo.TestID = TestID)
FROM 
    [TESTDB].[dbo].[TestTable]

返回的错误是:

消息 512,第 16 级,状态 1,第 2 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

如果您可以提供执行此查询的替代方法 - 即使用 ROW_NUMBER 或其他方法(无需对临时表执行选择,也无需声明单个变量)。

提前致谢!

【问题讨论】:

    标签: sql-server sql-server-2008 tsql sql-server-2005 sql-server-2012


    【解决方案1】:

    尝试给基表起别名

    SELECT TOP 1000 [TestID]
    ,[TestValue]
    ,[TestValue2]
    ,[TestValue3]
    ,(SELECT foo.TestValue + foo.TestValue2 FROM [TESTDB].[dbo].TestTable AS foo WHERE     foo.TestID=B.TestID) AS CompositeValue
    FROM [TESTDB].[dbo].[TestTable] AS B
    

    【讨论】:

    • 和宾果游戏,我们有一个赢家,除了现在你真的应该在子查询中为字段加上别名! :)
    猜你喜欢
    • 2011-09-21
    • 2014-06-12
    • 2018-11-04
    • 1970-01-01
    • 2012-10-19
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多