2015-05-09 58 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 |