我正在研究在某些条件下从几个表中提取数据的查询。结果集中的列必须包含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
表中的每个Patron
和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_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
数据。感谢。
答案 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
。