2016-02-25 102 views
0

我正在处理在特定条件下从多个表中绘制数据的查询。结果集中的列必须包含1-3类地址的值。这是一个典型的1个赞助人到1,3个赞助人地址关系。基于其他值从多行中选择相同的列

我的结果集中需要三个地址块。 (这是一个系统转换从ILS到另一个在我们的学术图书馆。)

每个人,从我所知道的,有ADDRESS_TYPE='1'PATRON_ADDRESS表中的行,这是一个街道地址

一些也有一个Address_Type = '2',这有时只是一个campusmailbox号码,有时是一个真实地址

大多数有一个Address_Type = '3',这是电子邮件地址。 是的,我同意。这是源系统中糟糕的数据库设计。

我有这样一个数据结构,我需要填充:

PATRON name, primary address street city state zip (Address_type 1), secondary address street city state zip (Address_Type 2) and an email field. 

注意,而底层的数据库是Oracle,在我目前的角色,我只能通过MS Access 2007中访问数据(bleah!)。所以我可能知道我可以在Oracle中做的事情,我认为它不适用于Access SQL。

因此,我需要从patron_id字段的同一表中抽取行,PATRON_ADDRESS。低于

此查询对于每一个patron_IDaddress_typePatron表,我需要从Patron_Address表有条件地选择列值。这个查询是做我需要的吗?

Select P.PATRON.P.PATRON_ID,P.PATRON.LAST_NAME, 

A1.StrretAddress_line1,A1.StreetAddress_Line2,etc.,A2.StreetAddress_Line1, A2.StreetAddress_Line2, A3.StreetAddress_Line1 

from PATRON P, PATRON_ADDRESS A1, PATRON_ADDRESS A2, PATRON_ADDRESS A3 

where (P.PATRON_ID = A1.PATRON_ID and 
     A1.ADDRESS_TYPE = '1') 
and 
    (P.PATRON_ID = A2.PATRON_ID and 
     A2.ADDRESS_TYPE = '2') 
and 
    (P.PATRON_ID = A3.PATRON_ID and 
     A3.ADDRESS_TYPE = '3'); 

我意识到,这将是相当低效的,但我不知道我怎么会参考各个列,如果我做了一个内部联接的PATRON_ADDRESSaddress type = 1数据,以及PATRON_ADDRESS涉及两个外连接来获得分别为address type = 2address_type = 3数据。谢谢。

+0

你能澄清你的数据结构吗? “PATRON名称,主要地址街道城市州邮政编码(Address_type 1),次要地址街道城市州邮政编码(Address_Type 2)和一个电子邮件字段。”那是4场?此外,您是否可以展示几行示例数据和您期望的结果。 – JNevill

回答

1

您应该可以在JOIN表中为每个地址。它与你所拥有的非常相似,但你真的应该使用JOIN语法,而不是列出FROM条款中的所有表格。这种形式的加入表格不清楚,不能完成JOIN条款可以实现的功能,并且在20年内一直在下降(已经下降)。

SELECT 
    P.patron_id, 
    P.last_name, 
    PA1.streetaddress_line1, 
    ... 
    PA2.streetaddress_line2, 
    ... 
    PA3.streetaddress_line3 
FROM 
    Patron P 
LEFT OUTER JOIN Patron_Address PA1 ON 
    PA1.patron_id = P.patron_id AND 
    PA1.address_type = '1' 
LEFT OUTER JOIN Patron_Address PA2 ON 
    PA2.patron_id = P.patron_id AND 
    PA2.address_type = '2' 
LEFT OUTER JOIN Patron_Address PA3 ON 
    PA3.patron_id = P.patron_id AND 
    PA3.address_type = '3' 

如果你知道每个人都有类型1的地址,那么你可以做到这一点INNER JOIN

相关问题