如何插入表中不存在的值?

时间:2018-06-06 08:27:00

标签: sql oracle11g

我有一个包含行的表,如下所示:

| ID | NAME | LOCALE |
| x  | name |   en   |
| x  | name |   ru   |
| y  | name1|   en   |
| y  | name1|   ru   |

等等。但是有些行只存在于一个语言环境中。我需要插入缺少的行,因此对于每个ID和NAME,2个区域设置有2行。

3 个答案:

答案 0 :(得分:2)

假设每个名称只有两个语言环境,那么这里有一个简单的选项:

INSERT INTO yourTable (ID, NAME, LOCALE)
SELECT
    ID,
    NAME,
    CASE WHEN LOCALE = 'en' THEN 'ru' ELSE 'en' END
FROM
(
    SELECT ID, NAME, MAX(LOCALE) AS LOCALE
    FROM yourTable
    GROUP BY ID, NAME
    HAVING COUNT(*) = 1
) t;

如果你实际上有两个以上的语言环境,那么我认为我们必须假设有一些包含所有语言环境的表。对这种情况的查询比我上面写的要复杂得多。

答案 1 :(得分:0)

如果我理解得很好,您可能需要以下内容:

测试用例:

create table someTable(ID, NAME, LOCALE) as (
    select 'x', 'name'  ,'en' from dual union all
    select 'x', 'name'  ,'ru' from dual union all
    select 'y', 'name1' ,'en' from dual union all
    select 'y', 'name1' ,'ru' from dual union all
    select 'z', 'ZZZZ' ,'ru' from dual
)

添加缺失的行:

merge into someTable s
using(
        select *
        from 
            (select 'en' LOCALE from dual union
             select 'ru' LOCALE from dual
            )  
            cross join
            ( select distinct ID, name from someTable)
     ) x
on (x.id = s.id and x.name = s.name and s.locale = x.locale)
when not matched then
    insert values (x.id, x.name, x.locale) 

结果:

ID NAME  LOCALE
-- ----- ------
x  name  en    
x  name  ru    
y  name1 en    
y  name1 ru    
z  ZZZZ  ru    
z  ZZZZ  en 

答案 2 :(得分:0)

添加缺少的名称条目:

INSERT INTO <YourTable>
(ID, NAME, LOCALE)
(
    SELECT t1. ID, 'name', t1.LOCALE 
    FROM <YourTable> t1
    WHERE NOT EXISTS
    (
        SELECT t2.LOCALE 
        FROM <YourTable> t2 
        WHERE t2.NAME = 'name' AND t1.LOCALE = t2.LOCALE
    )
)

添加缺少的 name1 条目:

INSERT INTO <YourTable>
(ID, NAME, LOCALE)
(
    SELECT t1.ID, 'name1', t1.LOCALE 
    FROM <YourTable> t1
    WHERE NOT EXISTS
    (
        SELECT t2.LOCALE 
        FROM <YourTable> t2 
        WHERE t2.NAME = 'name1' AND t1.LOCALE = t2.LOCALE
    )
)

如果字符串 name name1 不起作用,并且您只需要第二行就可以使用以下任何语言环境:

INSERT INTO <YourTable>
(ID, NAME, LOCALE)
(
    SELECT t1.ID, 'Placeholder for locale', t1.LOCALE 
    FROM <YourTable> t1
    WHERE 
    (
        SELECT COUNT(*) 
        FROM <YourTable> t2 
        WHERE t1.LOCALE = t2.LOCALE
    ) = 1
)