Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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,ddm_zip列只有5位Zipcode。tt_pad_zip列包含2-5之间的任意值。我想执行一个连接,选择出现在表两侧的值 但是,tt_pad_zip具有不同的粒度级别 例如,当我们在tt_pad_zip中看到值55时,它会考虑所有以55开头的Zipcode,例如551…553…55636等。因此,我希望联接选择此值 例如,当我们在tt_pad_zip中看到558的值时,它会考虑所有以558开头的Zipcode,例如5581…5585…558743等。因此,我希望联接选择此值 但是,如果tt_

ddm_zip列只有5位Zipcode。tt_pad_zip列包含2-5之间的任意值。我想执行一个连接,选择出现在表两侧的值

但是,tt_pad_zip具有不同的粒度级别

例如,当我们在tt_pad_zip中看到值55时,它会考虑所有以55开头的Zipcode,例如551…553…55636等。因此,我希望联接选择此值

例如,当我们在tt_pad_zip中看到558的值时,它会考虑所有以558开头的Zipcode,例如5581…5585…558743等。因此,我希望联接选择此值

但是,如果tt_pad_zip中有一个值的zipcode与ddm_zip完全相同,例如58636,如下所示,我希望输出选择这个值

column: ddm_zip       column: tt_pad_zip
55636                 55
57254                 5734
58636                 57254
                      58636
您可以尝试使用SUBSTR操作仅比较每列的前两个数字。我不知道您想要哪种类型的联接、表名或示例数据,但这里有一个很好的语法

SELECT
    *

FROM
    table1 INNER JOIN table2 ON SUBSTR(ddm_zip, 1, 2) = SUBSTR(tt_pad_zip, 1,2)

我认为您正在寻找以下内容:

-- Sample Data:
WITH dat (ddm_zip, tt_pad_zip) AS 
  (SELECT 0,55 FROM dual
    UNION ALL 
     SELECT 1,5734 FROM dual
    UNION ALL
     SELECT 2,57254 FROM dual
    UNION ALL  
     SELECT 3,55636 FROM dual
    UNION ALL
     SELECT 55636, 99 FROM dual
    UNION ALL  
     SELECT 57254, 88 FROM dual
    UNION ALL  
     SELECT 57341, 77 FROM dual)
-- Query:
SELECT d2.ddm_zip, d1.tt_pad_zip 
  FROM dat d1
  JOIN dat d2 
   -- Join the data via like:
    ON d2.ddm_zip LIKE d1.tt_pad_zip || '%'
   -- Exclude the data where a "better" match exists:
   AND NOT EXISTS (SELECT 1 FROM dat d3
                    WHERE d2.ddm_zip LIKE d3.tt_pad_zip || '%'
                      AND LENGTH(d1.tt_pad_zip) < LENGTH(d3.tt_pad_zip))
在ddm_zip的子字符串上进行连接,该子字符串的长度等于您要将其与之进行比较的tt_pad_zip值。要么:

SUBSTR( ddm_zip, 1, LENGTH( tt_pad_zip ) ) = tt_pad_zip
或:

Oracle安装程序:

查询:

输出:

输出:


dbfiddle

您可以将条件连接与ON子句中的CASE语句一起使用:

select t1.ddm_zip, t2.tt_pad_zip
from table1 t1 inner join table2 t2
on t1.ddm_zip like case 
  when exists(select 1 from table2 where tt_pad_zip = t1.ddm_zip) then t2.tt_pad_zip  
  else '%' || t2.tt_pad_zip || '%'
end
看。 结果:


@在上一个问题中,具有\u no \u名称的\u horse\u在不同的条件下进行联接。是否希望此联接仅为ddm\u zip中的每一行返回tt\u pad\u zip中的一行?具体来说,tt_pad_zip中具有最长匹配子字符串的行?@kfinity如果在tt_pad_zip中我们看到zipcode为55,那么我们选择ddm_zip中以55开头的所有zips,例如551551155643等。如果在tt_pad_zip中我们看到更细粒度的zipcode,如55636,那么我们加入这个zipcode,依此类推。我更新了问题以使其更清晰。我基本上是问您是想要Radagast81的答案还是MT0的答案,也就是说,当存在更细粒度的ZipCode时,是否要排除粒度更小的zipcodes。@kfinity没错,当存在粒度更细粒度的zipcodes时,我想排除粒度更小的zipcodes。
CREATE TABLE table1 ( ddm_zip ) AS
SELECT '55636' FROM DUAL UNION ALL
SELECT '57254' FROM DUAL UNION ALL
SELECT '55824' FROM DUAL;

CREATE TABLE table2 ( tt_pad_zip ) AS
SELECT '55'    FROM DUAL UNION ALL
SELECT '5734'  FROM DUAL UNION ALL
SELECT '57254' FROM DUAL UNION ALL
SELECT '55636' FROM DUAL;
SELECT *
FROM   table1 t1
       INNER JOIN
       table2 t2
       ON t1.ddm_zip LIKE t2.tt_pad_zip || '%'
DDM_ZIP | TT_PAD_ZIP :------ | :--------- 55636 | 55 55636 | 55636 57254 | 57254 55824 | 55
SELECT DDM_ZIP,
       MAX( TT_PAD_ZIP ) AS TT_PAD_ZIP
FROM   table1 t1
       INNER JOIN
       table2 t2
       ON t1.ddm_zip LIKE t2.tt_pad_zip || '%'
GROUP BY DDM_ZIP
DDM_ZIP | TT_PAD_ZIP :------ | :--------- 55636 | 55636 57254 | 57254 55824 | 55
select t1.ddm_zip, t2.tt_pad_zip
from table1 t1 inner join table2 t2
on t1.ddm_zip like case 
  when exists(select 1 from table2 where tt_pad_zip = t1.ddm_zip) then t2.tt_pad_zip  
  else '%' || t2.tt_pad_zip || '%'
end
> DDM_ZIP | TT_PAD_ZIP
> :------ | :---------
> 55636   | 55        
> 57254   | 57254     
> 58636   | 58636