我试图从一个小表中获取值,这些值不作为现有表中的列存在。
以下是我在SQL Server 2012中尝试过的一些代码:
BEGIN TRAN;
GO
CREATE TABLE [dbo].[TestValues](
[IdValue] [int] IDENTITY(1,1) NOT NULL,
[Code] [nvarchar](100) NULL,
) ON [PRIMARY];
GO
CREATE TABLE [dbo].[TestColumns](
[DateHour] [datetime2](7) NULL,
[test1] [nvarchar](100) NULL,
[test2] [nvarchar](100) NULL
) ON [PRIMARY]
GO
INSERT INTO [dbo].[TestValues] ([Code])
VALUES
(N'test1')
, (N'test2')
, (N'test3')
;
GO
SELECT
v.[Code]
, c.[name]
FROM
[dbo].[TestValues] AS v
LEFT OUTER JOIN [sys].[columns] AS c ON v.[Code] = c.[name]
WHERE
(c.[object_id] = OBJECT_ID(N'[dbo].[TestColumns]'))
AND (c.[column_id] > 1)
;
WITH
cteColumns AS (
SELECT
c.[name]
FROM
[sys].[columns] AS c
WHERE
(c.[object_id] = OBJECT_ID(N'[dbo].[TestColumns]'))
AND (c.[column_id] > 1)
)
SELECT
v.[Code]
, c.[name]
FROM
[dbo].[TestValues] AS v
LEFT OUTER JOIN cteColumns AS c ON v.[Code] = c.[name]
;
GO
ROLLBACK TRAN;
GO
在我看来,两个选择应该具有相同的输出。有人可以提供解释吗?
TestValues
是一个接收数据的表。 TestColumns
是在项目启动时通过持久化PIVOT
查询创建的表。最近插入TestValues
的过程收到了一些新数据。我尝试使用第一个查询获取新值,当结果没有显示任何新内容时,我感到很惊讶。
编辑1:谢谢院长的回答,这听起来是一个很好的解释。您是否有任何描述未选择表格行为的官方页面?我做了一个快速的谷歌搜索,我得到的只是链接到甲骨文。 (作为编辑添加,因为我没有足够的声誉点来评论)