根据其他值

时间:2016-02-25 17:57:08

标签: sql database ms-access

我正在研究在某些条件下从几个表中提取数据的查询。结果集中的列必须包含1-3种地址的值。这是典型的1赞助人与1,3赞助人地址的关系。

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

据我所知,每个人PATRON_ADDRESS ADDRESS_TYPE='1'表中都有一行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. ,这是电子邮件地址。 是的我同意。这是源系统中糟糕的数据库设计。

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

PATRON_ADDRESS

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

所以我需要根据patron_id字段从同一个表patron_ID中提取行。这是下面的查询

对于address_type表中的每个PatronPatron_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_ADDRESS

我意识到这将是相当低效的,但我不知道如果我为address type = 1数据执行PATRON_ADDRESS的内部JOIN,以及两个外部联接,我将如何引用各个列address type = 2分别获取address_type = 3** Assertion failure in -[_UICascadingTextStorage setLineBreakMode:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/TextSystem/_UICascadingTextStorage.m:292 数据。感谢。

1 个答案:

答案 0 :(得分: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