我的数据库中有两张表(品牌和客户)。Oracle中的简单SQL语句
品牌
客户
我想首先查找BRANDID为每一个客户。 然后comapre如果BRANDID再次匹配BRANDS表中的BRANDID。 如果匹配,则适当的BRANDNAME进入Customers BRANDNAME。 如果不匹配,一个字符串(无效)进入Customers BRANDNAME。
我需要使用INNER JOIN和CASE语句吗?
我的数据库中有两张表(品牌和客户)。Oracle中的简单SQL语句
品牌
客户
我想首先查找BRANDID为每一个客户。 然后comapre如果BRANDID再次匹配BRANDS表中的BRANDID。 如果匹配,则适当的BRANDNAME进入Customers BRANDNAME。 如果不匹配,一个字符串(无效)进入Customers BRANDNAME。
我需要使用INNER JOIN和CASE语句吗?
你只需要一个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中运行。
非常感谢。我能否认为COALESCE是“如果”?如果存在,那么相关的值就会变成但是不存在,那么COALESCE(a,b)中的第二个参数中的值会出现在列中? – user3503758
是的,'COALESCE'实际上是'CASE当b.brandname不为NULL,然后b.brandname ELSE'无效'END'的快捷方式,都是标准SQL。顺便说一句,Oracle的'NVL'就像'COALESCE',但专有 – dnoeth
甲骨文有自己的外部连接语法,这比标准的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) ;
要访问tabelsname.aCulumn,我们需要加入表格吗? – user3503758
这不是ANSI SQL,因为SQL中没有“IF”。 (顺便说一句:甲骨文不鼓励使用他们专有的(+)'运营商外部联接) –
UPDATE Customers c
SET BRANDNAME = COALESCE((SELECT b.BRANDNAME
FROM Brands b
WHERE c.BRANDID = b.BRANDID),
'Invalid');
查询1:
SELECT * FROM Customers
| ID | BRANDID | BRANDNAME |
|----|---------|-----------|
| 1 | 1 | APPLE |
| 1 | 2 | HTC |
| 1 | 3 | SAMSUNG |
| 1 | 10 | Invalid |
为什么你需要把名优产品列CUSTOMER表,你已经refe将其转换为BrandID。这会将数据放在多个容易出现数据不一致和冗余的地方。按照设计,这不是必需的。如果您需要显示每个客户列表的品牌名称,您可以使用JOIN? – HaveNoDisplayName
你可以添加你想要的输出的例子吗?请不要使用屏幕截图来获取示例数据。使用_formatted_文本(提示:选择要格式化的文本后点击'{}'按钮) –
我想要做的是实际上检查验证。我想创建一个加入当前两个表的表。在新表中,BRANDID和BRANDNAME列不止。无论如何,当插入时,我想确定BRANDID是否存在相关BRANDNAME也被插入,否则BRANDNAME被设置为别的东西。问题是,当我尝试加入表时,客户已经有一个条件BRANDID,品牌的BRANDID是一样的。这意味着新表将不会看到任何不匹配的数据。但我也需要处理不匹配或未加入的值。 – user3503758