选择“查询”以通过连接两个表来生成和排除某些结果

时间:2012-09-27 15:05:37

标签: sql select oracle10g

我有两个名为config和config_exceptions的表。两者都有相同的结构。列是home,configName,data,active。

配置表有以下数据

0 config1 my_data1 active
0 config1 my_data2 active
0 config1 my_data3 active
0 config2 my_data3 active
2 config1 my_data1 active
2 config2 my_data1 active

config_exceptions表具有以下数据

10 config1 my_data1 active

我需要编写一个查询来单独使用home 0来释放config_exceptions数据以提供结果,如下所示

0 config1 my_data1 active
0 config1 my_data2 active
0 config1 my_data3 active
0 config2 my_data3 active
2 config1 my_data1 active
2 config2 my_data1 active
10 config1 my_data2 active
10 config1 my_data3 active

此结果是使用home 0为home 10创建一组新的配置结果,并排除config_exceptions表数据。 用于比较的主要列是home和configName。

我不能硬编码为10,它们会更多,但0可以硬编码,因为它被用作基础。

请帮我写这个查询,我不知道。请给我一些想法。

2 个答案:

答案 0 :(得分:2)

嗯,有了你的样本,这确实有效。

SELECT home, configName, data, active
FROM config

UNION

SELECT ce.home, c.configName, c.data, c.active
FROM config_exceptions ce
INNER JOIN config c ON c.configName = ce.configName
WHERE ce.data <> c.data
AND c.home = 0

SqlFiddle

答案 1 :(得分:0)

我认为是这样的:

select *
from ((select home, configName, data, active
       from config
      ) union all
      (select 10 as home, configName, data, active
       from config c left outer join
            config_exceptions ce
            on c.home = ce.home and
               c.configName= ce.configName and
               c.active = ce.active
       where config = 0 and
             ce.home is null
      )
     )
order by 1, 2, 3, 4