2014-10-30 42 views
-1

SQL Server 2012的创建的视图替换嵌套SELECT,没有工作

这里是一个嵌套SELECT声明工程

SELECT DISTINCT Computer_Name, IP_Address, COUNT(Computer_ID) AS Num_Computer_ID 
FROM dbo.Computers 
WHERE Computer_Name in (SELECT DISTINCT Computer_Name 
         FROM dbo.Computers 
         WHERE dbo.Computers.COMPUTER_NAME LIKE '%s001' 
         AND dbo.Computers.IP_Address LIKE '%.100' 
         GROUP BY Computer_Name,IP_Address 
         HAVING COUNT(DISTINCT Computer_ID) > 1) 
AND dbo.Computers.COMPUTER_NAME LIKE '%s001' 
AND dbo.Computers.IP_Address LIKE '%.100' 
GROUP BY Computer_Name, IP_Address 
ORDER BY Num_Computer_ID DESC 

我创建的视图,以避免嵌套SELECT声明

CREATE VIEW V_Duplicate_ID 
AS SELECT DISTINCT Computer_Name 
FROM dbo.Computers 
WHERE dbo.Computers.COMPUTER_NAME LIKE '%s001' 
AND dbo.Computers.IP_Address LIKE '%.100' 
GROUP BY Computer_Name,IP_Address 
HAVING COUNT(DISTINCT Computer_ID) > 1; 

当我运行SELECT * FROM V_Duplicate_ID它的工作原理,但是当我合并视图来替换嵌套SELECT陈述

SELECT DISTINCT Computer_Name, IP_Address, COUNT(Computer_ID) AS Num_Computer_ID 
FROM dbo.Computers, [V_Duplicate_ID] 
WHERE dbo.Computers.Computer_Name = [dbo].[V_Duplicate_ID].Computer_Name 
AND dbo.Computers.COMPUTER_NAME LIKE '%s001' 
AND dbo.Computers.IP_Address LIKE '%.100' 
GROUP BY Computer_Name, IP_Address 
ORDER BY Num_Computer_ID DESC 

我得到的错误

Msg 209, Level 16, State 1, Line 6 
Ambiguous column name 'Computer_Name'. 
Msg 209, Level 16, State 1, Line 1 
Ambiguous column name 'Computer_Name'. 

如何解决?

+1

添加表的别名'Computer_Name'列(或'dbo.Computers'或'[V_Duplicate_ID ]')。请不要使用非ANSI,不推荐使用隐式连接 – Lamak 2014-10-30 18:43:22

+0

此外,您的查询看起来非常复杂,并且很可能会得到改进。 'Computer_ID'是'dbo.Computers'表的主键吗? – Lamak 2014-10-30 18:47:33

+0

@Lamak隐式联接既不是非ansi也不被弃用。它们是ANSI-89,更常见的用法是ANSI-92。它们也不被弃用。然而,它们很难处理,而且更容易发生意外交叉连接。 – 2014-10-30 19:05:07

回答

1

使用下面的select查询,简单地把dbo.Computers在SELECT和GROUP BY关键字的Computer_Name的前面。

因为当视图被创建时,它也有一个列名称Computer_name。所以有冲突。但是,当u单独查询之前执行,则列名会一直DISTINCT(计算机名)

SELECT DISTINCT **dbo.Computers.Computer_Name**, 
IP_Address, COUNT(Computer_ID) AS Num_Computer_ID 
FROM dbo.Computers, [V_Duplicate_ID] 
WHERE dbo.Computers.Computer_Name = [dbo].[V_Duplicate_ID].Computer_Name 
AND dbo.Computers.COMPUTER_NAME LIKE '%s001' 
AND dbo.Computers.IP_Address LIKE '%.100' 
GROUP BY **dbo.Computers.Computer_Name**, IP_Address 
ORDER BY Num_Computer_ID DESC