如果另一个表中存在满足特定条件的值,我如何才能在一个表中获取 Y 或 N 值?

Gov*_*apa 2 oracle join

我必须从三个名为客户、产品和订单的表生成简单的报告。我的报告应该有一栏显示客户是否订购了该产品。如何根据带有产品 ID 的订单中存在的客户 ID 获取 Y 或 N 值?数据示例表如下:

customer                
customer_id name    address phone   
123 govinda nepal   16910833    
234 arjun   nepal   15546235    

product             
product_id  name    brand   type    price
1   samsung gayalexy s5 samsung smartphone  55000
2   samsung gayalexy s6 samsung smartphone  65000

order               
date    product_id  customer_id     
1/1/2016    1   123     
5/1/2016    2   123     
Run Code Online (Sandbox Code Playgroud)

并希望报告栏如下

cust_id    name      product_id    order_stat
Run Code Online (Sandbox Code Playgroud)

order_stat 应为 Y 或 N。

ype*_*eᵀᴹ 5

似乎您需要产品和客户的所有组合(因此CROSS JOIN两个表之间),然后是相关EXISTS子查询。这可以是SELECT列表中的相关子查询:

SELECT 
    c.customer_id, 
    p.product_id,
    CASE WHEN EXISTS
              ( SELECT *
                FROM "order"  o
                WHERE o.product_id = p.product_id
                  AND o.customer_id = c.customer_id
              ) 
         THEN 'Y' ELSE 'N'
    END AS order_stat
FROM
    product  p
  CROSS JOIN
    customer  c ; 
Run Code Online (Sandbox Code Playgroud)

或 aLEFT JOIN到一个包含一行的虚拟表(dualOracle 中就是这样做的):

SELECT 
    c.customer_id, 
    p.product_id,
    CASE WHEN d.dummy IS NOT NULL 
         THEN 'Y' ELSE 'N'
    END AS order_stat
FROM
    product  p
  CROSS JOIN
    customer  c 
  LEFT JOIN
    dual  d
      ON EXISTS
              ( SELECT *
                FROM "order"  o
                WHERE o.product_id = p.product_id
                  AND o.customer_id = c.customer_id
              ) ; 
Run Code Online (Sandbox Code Playgroud)

散记:

  • 在表名或列名中使用保留关键字不太好,例如order. 因为每次使用它们时您都必须引用它们。