【问题标题】:How to do split and left join in oracle如何在oracle中进行拆分和左连接
【发布时间】:2018-08-09 06:46:13
【问题描述】:

我使用 toad for oracle,并且我有一个具有多个关联 (1-n) 的数据库。 我想将表中的 varchar 列(示例:1,2,3)与另一个表的 int (id)(示例:1) 列相关联。我正在数据库中为此操作创建一个视图,但外部应用和交叉应用不起作用。

在 sql 中找到的 dbo.split 命令也不起作用。

怎么办?

SELECT
      a.ID AS ID,
      a.ADI_NUMARASI AS aNAME,
      c.ID AS CODEID,   
      c.VALUE AS cVALUE   
 FROM  CUSTOMER a OUTER APPLY [dbo].[Split](a.TypeIDs, ',') Types 
LEFT JOIN CODE c ON c.ID= Types.Item  AND c.DOMAINID = a.DOMAINID

示例表

table CUSTOMER                                     table CODE
 ID | ADI_NUMARASI | TYPEIDS |DOMAINID         ID | DOMAINID | VALUE
 1      TEST1        1,2,3     1                1      1        XXX
                                                2      1        YYY
                                                3      2        ZZZ
                                                3      1        KKK

预期结果

 ID | aNAME | CODEID | cVALUE
 1    TEST1      1       XXX
 1    TEST1      2       YYY
 1    TEST1      3       KKK

【问题讨论】:

  • 你能给出示例输入数据和预期结果吗?
  • 欢迎使用stackoverflow,请证明一些表格和所需的输出。
  • 您确定您使用的是 oracle 而不是 mssql? split不是标准的Oracle函数
  • 我在 mysql 中使用 split 但我不知道如何在 oracle 中进行拆分。在 oracle 中如何拆分?

标签: sql oracle split


【解决方案1】:

试试:

SELECT cu.ID , cu.ADI_NUMARASI , co.ID , co.VALUE
FROM 
(
  SELECT id,ADI_NUMARASI,TYPEIDS,DOMAINID,
  regexp_substr(TYPEIDS,'[^,]+', 1, level) typeidsnew 
  FROM Customer 
  GROUP BY id,ADI_NUMARASI,TYPEIDS,DOMAINID,
  regexp_substr(TYPEIDS, '[^,]+', 1, level)
  connect by regexp_substr(TYPEIDS, '[^,]+', 1, level) is not null
) cu 
LEFT JOIN Code co ON cu.typeidsnew = co.ID
AND cu.DomainId = co.domainId 
ORDER BY cu.ID,co.ID

输出:http://sqlfiddle.com/#!4/177e8/1

【讨论】:

  • 立即尝试! @GülÖZCAN
【解决方案2】:

你可以试试这个

WITH splitedValues as (SELECT TRIM(REGEXP_SUBSTR(TYPEIDS, '[^,]+', 1, level)) as TYPEID 
                             , ADI_NUMARASI                                 
                             , DOMAINID
                        FROM CUSTOMER
                      CONNECT BY level <= REGEXP_COUNT(TYPEIDS, '[^,]+'))
select * 
  from splitedValues s 
  join code c on s.TYPEID = c.id and s.domainid =  c.domainid

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 2019-06-06
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多