2015-05-09 47 views
1

我的數據庫中有兩張表(品牌和客戶)。Oracle中的簡單SQL語句

品牌

my tables

客戶

我想首先查找BRANDID爲每一個客戶。 然後comapre如果BRANDID再次匹配BRANDS表中的BRANDID。 如果匹配,則適當的BRANDNAME進入Customers BRANDNAME。 如果不匹配,一個字符串(無效)進入Customers BRANDNAME。

我需要使用INNER JOIN和CASE語句嗎?

+0

爲什麼你需要把名優產品列CUSTOMER表,你已經refe將其轉換爲BrandID。這會將數據放在多個容易出現數據不一致和冗餘的地方。按照設計,這不是必需的。如果您需要顯示每個客戶列表的品牌名稱,您可以使用JOIN? – HaveNoDisplayName

+0

你可以添加你想要的輸出的例子嗎?請不要使用屏幕截圖來獲取示例數據。使用_formatted_文本(提示:選擇要格式化的文本後點擊'{}'按鈕) –

+0

我想要做的是實際上檢查驗證。我想創建一個加入當前兩個表的表。在新表中,BRANDID和BRANDNAME列不止。無論如何,當插入時,我想確定BRANDID是否存在相關BRANDNAME也被插入,否則BRANDNAME被設置爲別的東西。問題是,當我嘗試加入表時,客戶已經有一個條件BRANDID,品牌的BRANDID是一樣的。這意味着新表將不會看到任何不匹配的數據。但我也需要處理不匹配或未加入的值。 – user3503758

回答

1

你只需要一個OUTER JOIN加COALESCE:

select 
    c.id, 
    c.brandid, 
    coalesce(b.brandname, 'Invalid') 
from customers c 
left join brands b on c.brandid = b.brandid; 

這是純粹的標準SQL,應該在任何DBMS中運行。

+0

非常感謝。我能否認爲COALESCE是「如果」?如果存在,那麼相關的值就會變成但是不存在,那麼COALESCE(a,b)中的第二個參數中的值會出現在列中? – user3503758

+1

是的,'COALESCE'實際上是'CASE當b.brandname不爲NULL,然後b.brandname ELSE'無效'END'的快捷方式,都是標準SQL。順便說一句,Oracle的'NVL'就像'COALESCE',但專有 – dnoeth

1

甲骨文有自己的外部連接語法,這比標準的SQL好得多,但這裏的ANSI SQL查詢:

select customers.id,customers.brandid, 
if(brands.brandname is null,'Invalid',brands.brandname) as 'Brandname' 
from customers 
left join brands on (customers.brandid = brands.brandid) ; 
+0

要訪問tabelsname.aCulumn,我們需要加入表格嗎? – user3503758

+3

這不是ANSI SQL,因爲SQL中沒有「IF」。 (順便說一句:甲骨文不鼓勵使用他們專有的(+)'運營商外部聯接) –

1

SQL Fiddle

UPDATE Customers c 
SET BRANDNAME = COALESCE((SELECT b.BRANDNAME 
          FROM Brands b 
          WHERE c.BRANDID = b.BRANDID), 
          'Invalid'); 

查詢1

SELECT * FROM Customers 

Results

| ID | BRANDID | BRANDNAME | 
|----|---------|-----------| 
| 1 |  1 |  APPLE | 
| 1 |  2 |  HTC | 
| 1 |  3 | SAMSUNG | 
| 1 |  10 | Invalid |