Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-返回列匹配最多的行_Sql_Oracle - Fatal编程技术网

SQL-返回列匹配最多的行

SQL-返回列匹配最多的行,sql,oracle,Sql,Oracle,考虑下表: Name Color1 Color2 Color3 Prize ----------------------------------------- Bob Red Blue Green Stapler Bob Red Blue NA Pencil Bob Red NA NA Lamp Bob Red NA NA

考虑下表:

Name   Color1    Color2    Color3   Prize
-----------------------------------------
Bob    Red       Blue      Green    Stapler
Bob    Red       Blue      NA       Pencil
Bob    Red       NA        NA       Lamp
Bob    Red       NA        NA       Chair
Bob    NA        NA        NA       Mouse Pad
鲍勃有三种颜色。这就是我想要得到的:

(#1) If Bob has Red, Blue, Green (match 3) ....  Return Stapler
(#2) If Bob has Red, Blue, Purple (match 2) ...  Return Pencil
(#3) If Bob has Red, Orange, Purple (match 1) .  Return Lamp AND Chair rows
(#4) If Bob has Brown, Pink, Black (match 0) ..  Return Mouse Pad
颜色只会出现在它们自己的列中。因此,在上面的示例中,红色将仅出现在Color1列中,而不会出现在Color2或Color3中。黑色将只使用Color3,而不会使用Color1或Color2。等等

我只想要匹配最多的行

我真的不希望使用4个单独的SELECT语句来执行此操作,并且每次检查它们是否返回一行。我在存储过程中就是这样做的,它很笨重

如何在1 SQL语句中执行此操作?使用Oracle如果这很重要


谢谢

您可以使用
case
计算匹配项,然后获取包含最多匹配项的行。在Oracle中,这将使用几个子查询:

select name
from (select t.*
      from (select t.*,
                   ((case when color1 in ('Red', 'Blue', 'Green') then 1 else 0 end) +
                    (case when color2 in ('Red', 'Blue', 'Green') then 1 else 0 end) +
                    (case when color3 in ('Red', 'Blue', 'Green') then 1 else 0 end) +
                   ) as numMatches
            from table t
           ) t
      order by nummatches desc
     ) t
where rownum = 1;
我只想要匹配最多的行

您可以使用函数rank()进行以下操作:

这将返回匹配最多的一行或多行

select name, color1, color2, color3, prize 
  from (
    select t.*, rank() over (order by decode(color1, 'Red', 1, 0) 
        + decode(color2, 'Blue', 1, 0) + decode(color3, 'Green', 1, 0) desc) rnk
      from t)
  where rnk = 1