2014-06-29 330 views
0

任何人都可以通過以下語句提供幫助。我是SQL新手,可能忽略了顯而易見的事實。SQL和查找不符合條件的記錄

我試圖運行以下查詢 有一個貨物表與相應的列(PROJECTNO,SUPPLIERNO) 我知道我不把貨物。在名稱前面,但這最終會以多表格查詢結束。

SELECT sup1.SHIPMENTS.PROJECTNO, sup2.SHIPMENTS.PROJECTNO 
FROM SHIPMENTS sup1, SHIPMENTS sup2 
WHERE sup1.SHIPMENTS.PROJECTNO = sup2.SHIPMENTS.PROJECTNO 
AND sup1.SHIPMENTS.SUPPLIERNO <> sup2.SHIPMENTS.SUPPLIERNO; 

我不斷收到以下錯誤。

ORA-00904: "SUP2"."SHIPMENTS"."SUPPLIERNO": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 
Error at Line: 160 Column: 34 

在此先感謝

+0

歡迎來到Stack Overflow。您可以使用** {} **工具欄按鈕格式化源代碼。這次我爲你做了。 –

回答

1

改變所有sup2.SHIPMENTS.SUPPLIERNOsup2.SUPPLIERNO,並做SUP1別名相同,而對於其他colummns。

您必須瞭解別名。一旦你別名表TAB爲T,那麼你應該把它稱爲簡單T.

在你的FROM子句,當你說

FROM SHIPMENTS sup1, SHIPMENTS sup2 

你走樣SHIPMENTS表作爲SUP1和SUP2(如2個實例同一張桌子)。所以,你需要使用SUP1和SUP2作爲表名和真實姓名(貨物)是無效的,而且將是不明確的,無論如何,所以使用:

sup1.SUPPLIERNO --refers to SUPPLIERNO column in SHIPMENTS table aliased as sup1 
sup2.PRODUCTNO --refers to PRODUCTNO column in SHIPMENTS table aliased as sup2 

有沒有這樣的東西sup2.SHIPMENTS .SUPPLIERNO因爲沒有sup2.SHIPMENTS表

另外,一個一般的規則要記住,在Oracle中你可以使用象table.column,schema.table或schema.table.column這樣的符號來引用到表/視圖或列。在這種情況下,你寫的東西等於table.table.column,這是沒有意義的(除非你使用嵌套表)。

您在這裏必須使用別名的原因是,它是將表連接到自身的唯一方法。如果你使用完整的表名兩次,你會得到不明確的錯誤。當您自行加入表格時,Oracle會將每個實例(別名)視爲查詢中的不同表格。我更喜歡使用a和b之類的別名來減少拼寫錯誤。

SELECT a.PROJECTNO, b.PROJECTNO 
FROM SHIPMENTS a JOIN SHIPMENTS b USING(PROJECTNO) 
WHERE a.SUPPLIERNO <> b.SUPPLIERNO; 
+0

謝謝修復它。 – user3786519

1

您的查詢應該寫成:

SELECT sup1.PROJECTNO, sup2.PROJECTNO 
FROM SHIPMENTS sup1 JOIN 
    SHIPMENTS sup2 
    on sup1.PROJECTNO = sup2.SHIPMENTS.PROJECTNO AND 
     sup1.SUPPLIERNO <> sup2.SUPPLIERNO; 

首先,使用別名時,有沒有必要再次指定表名。此外,您應該使用明確的join語法,並使用on條件。隱式語法支持where子句中的條件,但它不那麼強大且難以閱讀。