oracle 用于填充条件中这两个表之一的引用代码

oprakyz7  于 2023-02-03  发布在  Oracle
关注(0)|答案(2)|浏览(71)

我不知道如何获得正确的脚本
要获取参考代码详细信息,其中一个表"car_col"必须填写其他第二个表"car_cat"的非重复结果,如果"car_col"没有,则填写"car_cat"

select 
a. customer_id ,
a. car_code ,
b. description as code_desc ,
a. price

from product a

left join (select * from reference_codes where domain in ('car_col', 'car_cat') ) b
on a. car_code   =  b. code

输出结果;
| 客户ID|电码|描述|
| - ------|- ------|- ------|
| 一百二十三|十二|蓝色|
| 一百二十三|二十三|黑色|
| 三四五|四十五|红色|
| 三四五|四十五|红色|
| 六百七十八|六十七|绿色|
| 六百七十八|二十四|黄色|
| 九零八|四十五|红色|
| 九零八|七十|紫色|
如您所见,客户345有两行代码45为红色
以下参考表;
从参考代码中选择 *,其中域='car_col'
| 领域|代码|描述|
| - ------|- ------|- ------|
| 车列|十二|蓝色|
| 车列|二十三|黑色|
| 车列|四十五|红色|
| 车列|六十七|绿色|
从参考代码中选择 *,其中域='car_cat'
| 领域|代码|描述|
| - ------|- ------|- ------|
| 汽车类别|二十四|黄色|
| 汽车类别|四十五|红色|
| 汽车类别|七十|紫色|
| 汽车类别|九十|行|
我要输出结果
| 客户ID|电码|描述|
| - ------|- ------|- ------|
| 一百二十三|十二|蓝色|
| 一百二十三|二十三|黑色|
| 三四五|四十五|红色|
| 六百七十八|六十七|绿色|
| 六百七十八|二十四|黄色|
| 九零八|四十五|红色|
| 九零八|七十|紫色|
我正在使用ORACLE SQL
谢谢

qoefvg9y

qoefvg9y1#

很难给予一个具体的答案,真正看到所有的数据或模型,但我解释你的要求:

  • “如果找不到客户与CAR_COL的联接,则返回使用CAR_CAT”*

利用您现有的代码,我们可以添加一个列来“区分”数据的优先级,例如

select *
from (
    select 
      a.customer_id ,
      a.car_code ,
      b.description as code_desc ,
      a.price,
      row_number() over ( partition by customer_id, car_code
         order by case when domain = 'car_col' then 1 else 2 end ) as rating
    from product a
    left join (select * from reference_codes 
               where domain in ('car_col', 'car_cat') ) b
    on a. car_code   =  b. code
)
where rating = 1
disho6za

disho6za2#

如果示例数据如下所示:

WITH
    reference_codes (DOMAIN, CAR_CODE, DESCRIPTION) AS
        (
            Select  'car_col',  12, 'blue'      From  Dual Union All
            Select  'car_col',  23, 'black'     From  Dual Union All
            Select  'car_col',  45, 'red'       From  Dual Union All
            Select  'car_col',  67, 'green'     From  Dual Union All
                    
            Select  'car_cat',  24, 'yellow'    From  Dual Union All
            Select  'car_cat',  45, 'red'       From  Dual Union All
            Select  'car_cat',  70, 'purple'    From  Dual Union All
            Select  'car_cat',  90, 'row'       From  Dual 
        ),
    product (CUSTOMER_ID, CODE, PRICE) AS
        (
            Select 123, 12, 100     From  Dual Union All
            Select 123, 23, 100     From  Dual Union All
            Select 345, 45, 120     From  Dual Union All
            Select 345, 45, 120     From  Dual Union All
            Select 678, 67, 110     From  Dual Union All
            Select 678, 24, 110     From  Dual Union All
            Select 908, 45, 130     From  Dual Union All
            Select 908, 70, 130     From  Dual 
        )

...那么您的查询结果将如上所示。虽然选择了PRICE列,但我们无法看到您的问题中的值。

CUSTOMER_ID       CODE CODE_DESC      PRICE
----------- ---------- --------- ----------
        123         12 blue             100 
        123         23 black            100 
        345         45 red              120 -- one row less if 'car_col' is missing
        345         45 red              120 
        345         45 red              120 
        345         45 red              120 
        678         24 yellow           110 
        678         67 green            110 
        908         70 purple           130 
        908         45 red              130 
        908         45 red              130

要得到你预期的结果(如果没有不同的价格),你可以只添加DISTINCT关键字,以获得你想要的:

Select DISTINCT
... ... ... your query
CUSTOMER_ID       CODE CODE_DESC      PRICE
----------- ---------- --------- ----------
        123         12 blue             100 
        123         23 black            100 
        345         45 red              120 
        678         24 yellow           110 
        678         67 green            110 
        908         45 red              130 
        908         70 purple           130

......如果价格不同,您可以使用按以下方式分组的聚合

Select    
    a.CUSTOMER_ID ,
    a.CODE ,
    b.DESCRIPTION "CODE_DESC",
    AVG(a.PRICE) "AVG_PRICE"
From
    product a
Left Join 
    ( Select * From reference_codes Where DOMAIN IN('car_col', 'car_cat') ) b
    ON(a.CODE =  b.CAR_CODE)    
Group By
    a.CUSTOMER_ID ,
    a.CODE ,
    b.DESCRIPTION
Order By 
    a.CUSTOMER_ID
CUSTOMER_ID       CODE CODE_DESC  AVG_PRICE
----------- ---------- --------- ----------
        123         12 blue             100 
        123         23 black            100 
        345         45 red              120 
        678         24 yellow           110 
        678         67 green            110 
        908         45 red              130 
        908         70 purple           130

即使缺少'car_col',您的查询也可以通过DISTINCT或聚合进行调整(取决于PRICE):

WITH
    reference_codes (DOMAIN, CAR_CODE, DESCRIPTION) AS
        (
            Select  'car_col',  12, 'blue'      From  Dual Union All
            Select  'car_col',  23, 'black'     From  Dual Union All
--Select    'car_col',  45, 'red'       From  Dual Union All
            Select  'car_col',  67, 'green'     From  Dual Union All
                    
            Select  'car_cat',  24, 'yellow'    From  Dual Union All
            Select  'car_cat',  45, 'red'       From  Dual Union All
            Select  'car_cat',  70, 'purple'    From  Dual Union All
            Select  'car_cat',  90, 'row'       From  Dual

相关问题