Sql Oracle DB:与多个值类似

Sql Oracle DB:与多个值类似,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,这是我的问题 SELECT dia FROM CRES WHERE pro_id = 2 AND 8103434563 LIKE ( SELECT dial_pattern||'%' FROM CDIVN WHERE dial_id = 1 ); 现在从CDIVN中选择拨号模式| |“%”,其中拨号id=1可以给出多个结果。因此,我的主查询失败,原因是“子查询返回多行”。这是因为我提到了类似的 但是我的逻辑需要像一样的,因为我需要表CDIVN中带有模式匹配条件的8103434563 如

这是我的问题

SELECT dia
FROM CRES
WHERE pro_id = 2
AND 8103434563 LIKE
  ( SELECT dial_pattern||'%' FROM CDIVN WHERE dial_id = 1
  );
现在
从CDIVN中选择拨号模式| |“%”,其中拨号id=1
可以给出多个
结果。因此,我的主查询失败,原因是
“子查询返回多行”
。这是因为我提到了类似的

但是我的逻辑需要像
一样的
,因为我需要表CDIVN中带有模式匹配条件的8103434563

如何修改查询。请帮忙

=======

 CREATE TABLE CDIVN
   (    DIAL_PATTERN_ID NUMBER NOT NULL ENABLE, 
    DIAL_PATTERN VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    OTHERS VARCHAR2(64 BYTE), 
     CONSTRAINT "CDIVN_PK" PRIMARY KEY ("DIAL_PATTERN_ID", "DIAL_PATTERN")

   );


Insert into CDIVN (DIAL_PATTERN_ID,DIAL_PATTERN,OTHERS) values (1,'810','abc');
Insert into CDIVN (DIAL_PATTERN_ID,DIAL_PATTERN,OTHERS) values (1,'811','xyz');
Insert into CDIVN (DIAL_PATTERN_ID,DIAL_PATTERN,OTHERS) values (1,'812','aaa');
Insert into CDIVN (DIAL_PATTERN_ID,DIAL_PATTERN,OTHERS) values (5,'999','www');
Insert into CDIVN (DIAL_PATTERN_ID,DIAL_PATTERN,OTHERS) values (9,'333','ewe');


  CREATE TABLE CRES
   (    PROFILE_ID NUMBER NOT NULL ENABLE, 
    PROFILE_NAME VARCHAR2(50 BYTE) NOT NULL ENABLE, 
    DIALLED_PATTERN VARCHAR2(15 BYTE), 
     CONSTRAINT "CRES_PK" PRIMARY KEY ("PROFILE_ID")

   ) ;


Insert into CRES (PROFILE_ID,PROFILE_NAME,DIALLED_PATTERN) values (1,'A','1');
Insert into CRES (PROFILE_ID,PROFILE_NAME,DIALLED_PATTERN) values (2,'B','5');
Insert into CRES (PROFILE_ID,PROFILE_NAME,DIALLED_PATTERN) values (3,'C','9');
我有CRES档案id和其他来源的一个号码,分别是1和81034345

现在
从CRES中选择拨号模式,其中PROFILE_ID=1

这将使我的拨号模式为1

现在
从CDIVN中选择拨号模式,其中DIALLED\u PATTERN\u ID=1(DIALLED\u PATTERN)

这将使拨号模式为810811812


现在,如果81034345与任何一个810%或811%或812%匹配。然后我需要810%作为我的答案。

如果我可以这么说的话,我还疯狂地痴迷于让sql在LIKE功能中有一个。要做到这一点,您可以在表
CRES
中将其作为
JOIN
编写,而不是将子查询放入您的条件中

在我看来,子查询

( SELECT dial_pattern||'%' FROM CDIVN WHERE dial_id = 1
  );

在中,标准不会直接影响表
CRES
中的行,而是用作所有结果的过滤器。也就是说,如果子查询不返回(a)值,那么整个查询也不应该返回任何内容。

您走的方向是正确的,只需要将两个表连接起来,而不需要子查询,您可以直接使用拨号模式| |'%”之类的

SQL> SELECT a.*, b.*
  2  FROM CRES A
  3  JOIN CDIVN b
  4  ON (b.DIAL_PATTERN_ID = A.profile_id)
  5  WHERE TO_CHAR(8103434563) LIKE dial_pattern||'%';

PROFILE_ID PROFILE_NAME DIALLED_PATTERN DIAL_PATTERN_ID DIAL_PATTER OTHERS
---------- ------------ --------------- --------------- ----------- ------
         1 A            1                             1 810         abc

如果我理解正确,我会选择:

SELECT dia
FROM   CRES
WHERE  pro_id = 2
AND    exists (
         SELECT null
         FROM   CDIVN
         WHERE  dial_id = 1 and
                TO_CHAR(8103434563) like dial_pattern||'%');

收集相似的值并构建一个regexp表达式,例如

-- Test Data
with CDIVN as
 (select 1 as dial_id, 'ABC' as val
    from dual
  union all
  select 1 as dial_id, 'ACD' as val
    from dual
  union all
  select 1 as dial_id, 'XXA' as val from dual),

CRES as
 (select 2 as proc_id, 'ABCD' as val
    from dual
  union all
  select 2 as proc_id, 'DABCD' as val
    from dual
  union all
  select 2 as proc_id, 'ACF' as val
    from dual
  union all
  select 2 as proc_id, 'XXAF' as val from dual)

,
-- Build regexp expression: 1, 'ABC|ACD|XXA'
CDIVN_PATTERN as
 (select dial_id,
         listagg(val, '|') within group(order by dial_id) as val_pattern
    from CDIVN
   group by dial_id)

-- Use this expression by regexp_like
select *
  from CRES c
 where regexp_like(c.val,
                   (select '^' || p.val_pattern
                      from cdivn_pattern p
                     where p.dial_id = 1));

要加入的
CRES
CDIVN
表之间的关系是什么?拨号id。CRES拨号id是CDIVN拨号id的外键。从CDIVN中选择拨号模式| |'%”,其中拨号id=1,这里1是CRES-dial,然后需要加入表。查看我的答案。发布create和insert语句并显示所需的输出。至少创建一个@Lalit Kumar B:更新的问题。您现在可以查看拨号id了吗?CRES拨号id是CDIVN拨号id的外键。从CDIVN中选择拨号模式| | |“%”,其中拨号id=1,这里1是CRES-dial\U id。您能建议如何在CDIVN表中写入吗?但我有多种拨号模式,即810、812、813,拨号为1。现在,如果8103434563与任何人(810812813)匹配,它应该返回。此处8103434563与8103434563匹配如果您得到拨号模式以
8
开头的所有行,您是否确定?或者您只需要三种模式
810、812和813
81%
对您合适吗?这将为您提供所有以
81
开头的拨号模式。在CDIVN表中,我有多个拨号模式,即810、812、813,其中拨号为1。现在8103434563 like(810%,812%,813%),然后它与810%匹配,然后它应该返回值不应该是b。拨号模式类似于%8103434563%,但我需要8103434563 like(来自CDIVN的模式匹配用于ex 810%,812%,813%)@VJS Ok,请参阅更新的查询。请将其标记为已回答,这也会帮助他人!。不。我想要这样的东西…逻辑上…我知道这个查询是错误的,但逻辑上我需要从CRS选择拨号模式,其中PROFILE_ID=1和81032144类似(从CDIVN选择拨号模式,其中DIAL_ID=1);