2014-10-30 45 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