用于连接2个表的SQL,但对于我的理解有点复杂

时间:2015-08-05 10:52:51

标签: oracle-sqldeveloper

有一种情况有点超出我的理解。

表A包含产品,国家和工厂 表B包含产品,工厂和城市。

这种情况是销售预测数据从国家/地区级别经过工厂流向城市级别。我们只在鹿特丹和阿姆斯特丹设有工厂。问题是表A中的工厂需要与表B中的工厂相同。

我必须清理表A中的工厂错误并需要清洁的情况C& D。因此,我首先要确定这些错误的记录:

这是我到目前为止加入表A和B

所得到的

选择A.Prod,A.country,A.factory,B.Prod,B.factory,B.City来自Table1 A,Table2 B where and A.Prod = B.Prod and A.Factory&lt ;> B.Factory

当然我可以通过使用下面的SQL找到一个特定的已知错误记录,但我需要查找所有错误记录而不指定任何产品或

从表1 A,表2B中选择A.Prod,A.country,A.factory,B.Prod,B.factory,B.City,其中A.Prod = B.Prod和A.Factory< > B.Factory 和A.Country ='挪威'和A.Factory ='鹿特丹'和B.City ='奥斯陆'

情况1

表A

产品国家工厂
ProdA瑞士鹿特丹

表B

产品工厂城 ProdA鹿特丹日内瓦

情况2

表A

产品国家工厂
Prod Germany Rotterdam

表B

产品工厂城 ProdB鹿特丹德累斯顿

情况3

表A

产品国家工厂
ProdC Norway Rotterdam

表B

产品工厂城 ProdC Amsterdam Oslo

情况4

表A

产品国家工厂
ProdD芬兰鹿特丹

表B

产品工厂城 ProdD Amsterdam Helsinki

1 个答案:

答案 0 :(得分:0)

根据我的理解表A中对国家的预测必须是表B中的一个城市,该表存在于表A中的国家。

所以,在情况1中,我们有 表A国家=瑞士,表B城市=日内瓦。 由于日内瓦在瑞士,这很好 在情况2中,我们有 表A国家=德国,表B城市=德累斯顿 由于德累斯顿在德国,这很好。

这为我们提供了解决问题的线索。

步骤1.为您的预期国家/城市设置表格

CREATE TABLE COUNTRY_CITY (COUNTRY VARCHAR(60), CITY VARCHAR(60));

步骤2.将预期国家/城市的值插入表

INSERT INTO COUNTRY_CITY(COUNTRY,CITY) VALUES('GERMANY','DRESDEN');
INSERT INTO COUNTRY_CITY(COUNTRY,CITY) VALUES('SWITZERLAND','GENEVA');
INSERT INTO COUNTRY_CITY(COUNTRY,CITY) VALUES('NORWAY','OSLO');
INSERT INTO COUNTRY_CITY(COUNTRY,CITY) VALUES('FINLAND','HELSINKI');

第3步。

select A.Prod,A.country, A.factory, B.Prod, B.factory, B.City,
       COUNTRY_CITY.CITY
from 
Table1 A
INNER JOIN Table2 B ON A.Prod=B.Prod 
INNER JOIN COUNTRY_CITY ON A.COUNTRY = COUNTRY_CITY.COUNTRY
where  COUNTRY_CITY.CITY = B.city and A.Factory <> B.Factory

因此,在第3步中,我们向数据库提供哪个城市属于哪个国家的知识,以便我们可以从表A到表B进行连接。一旦得到,那么不匹配工厂的条件应该是您正在寻找的记录