SQL Sub-Select使用主键

时间:2014-10-24 09:38:21

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

我正在寻找从行集上的子选择查询中检索值,其中我只需要来自主查询的当前行的值(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]

返回错误是:

  

Msg 512,Level 16,State 1,Line 2
  子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

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

提前致谢!

1 个答案:

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