创建具有多个表的视图?
Posted
技术标签:
【中文标题】创建具有多个表的视图?【英文标题】:Creating a view with multiple tables? 【发布时间】:2015-04-01 17:52:34 【问题描述】:我正在尝试创建一个包含 5 个表的视图,但是在尝试将最后两个表连接在一起时遇到了问题。
这是我当前的 mysql 查询:
CREATE VIEW s_view AS
SELECT AC.id, A.id AS account_id, A.name, A.description, A.industry, A.phone_fax, A.phone_office, A.shipping_address_street, A.shipping_address_city, A.shipping_address_state, A.shipping_address_postalcode, A.shipping_address_country, C.id AS contact_id, C.first_name, C.last_name, C.title, C.department, C.phone_home, C.phone_mobile, C.phone_work, C.primary_address_street, C.primary_address_city, C.primary_address_state, C.primary_address_postalcode, C.primary_address_country, EA.Email_address
FROM ACCOUNTS A
INNER JOIN ACCOUNTS_CONTACTS AS AC ON A.id = AC.account_id
INNER JOIN CONTACTS AS C ON C.id = AC.contact_id
INNER JOIN EMAIL_ADDR_BEAN_REL AS ER ON ER.bean_id = A.id
INNER JOIN EMAIL_ADDRESSES AS EA ON ER.email_address_id = EA.id
我的表格是按以下方式设置的:
帐户(id、first_name、last_name 等)
联系人(身份证、姓名等)
ACCOUNT_CONTACTS(id、account_id、contact_id)
EMAIL_ADDR_BEAN_REL(id、bean_id(与 account_id/contact_id 相同)、email_address_id)
EMAIL_ADDRESSES (email_address_id, email_address)
我遇到的问题是 EMAIL_ADDR_BEAN_REL 表有一个可以引用 account_id 或 contact_id 的 bean_id。因此,当我加入表格时,它只返回帐户电子邮件地址,但是我希望它同时返回帐户电子邮件地址和联系人电子邮件地址?
我感觉这是我加入牌桌的方式有问题,但我不确定如何继续前进?
谢谢!
【问题讨论】:
怎么知道bean_id是引用account_id还是contact_id?是否有另一个字段指定或只是存在或缺乏? @PeterBowers 在该表中还有另一个字段:bean_module 指定它是帐户还是联系人。我假设在编写我的选择时,我需要两个电子邮件字段,一个用于帐户,一个用于联系人,我只是不知道该怎么做:S 是否总是有帐户电子邮件地址和联系人电子邮件地址?或者一个或两个都可以为空? @BK435 这些字段可以为空 您能否确认您现有的查询(去掉顶部的“CREATE VIEW”内容)是否在您的系统中生成行?由于我此时添加的只是LEFT JOIN
(实际上将您的INNER JOIN
之一更改为LEFT
),因此我的查询应该返回可能更多的行,而且永远不会更少......
【参考方案1】:
您可以为 EMAIL_ADDR_BEAN_REL 表设置 2 个单独的别名并适当地引用它(因为您的结构,您还必须添加另一个别名版本的 email_address):
CREATE VIEW s_view AS
SELECT AC.id, A.id AS account_id, A.name, A.description, A.industry,
A.phone_fax, A.phone_office, A.shipping_address_street,
A.shipping_address_city, A.shipping_address_state,
A.shipping_address_postalcode, A.shipping_address_country,
C.id AS contact_id, C.first_name, C.last_name, C.title,
C.department, C.phone_home, C.phone_mobile, C.phone_work,
C.primary_address_street, C.primary_address_city,
C.primary_address_state, C.primary_address_postalcode,
C.primary_address_country,
EA.Email_address,
EA_C.Email_address AS Email_address_c
FROM ACCOUNTS A
INNER JOIN ACCOUNTS_CONTACTS AS AC ON A.id = AC.contact_id
INNER JOIN CONTACTS AS C ON C.id = AC.account_id
LEFT JOIN EMAIL_ADDR_BEAN_REL AS ER ON ER.bean_id = AC.id
AND ER.bean_module = 'accounts'
LEFT JOIN EMAIL_ADDR_BEAN_REL AS ER_C ON ER.bean_id = C.id
AND ER_C.bean_module = 'contacts'
LEFT JOIN EMAIL_ADDRESSES AS EA ON ER.email_address_id = EA.id
LEFT JOIN EMAIL_ADDRESSES AS EA_C ON ER_C.email_address_id = EA_C.id
编辑
由于您不必为帐户或联系人设置一行(如果我从上面的 cmets 中正确理解 - 谢谢,@BK435),现在将其设置为 LEFT JOIN。我还添加了bean_module
列的指定(尽管我不确定您使用的是什么代码)。
【讨论】:
这将返回零结果 :( 抱歉 - 我复制/粘贴了最后一行,忘记重命名最后一列名称的别名。现在再试一次。 @Peter,根据 OP 响应,如果联系人和帐户的电子邮件地址字段都可以为空,您是否不需要在 Email_Addresses 上左连接以产生结果而不是内部连接? 对不起,我原来的帖子有错误,现在已修复。但是,即使在修复了我的错误并使用您的查询后,它仍然返回零结果 "INNER" 和 "OUTER" 是句法绒毛,据我所知。说INNER JOIN
与说JOIN
是一样的。说LEFT JOIN
与说OUTER LEFT JOIN
是一样的。我对此不是 100% 确定,但大约 98%。以上是关于创建具有多个表的视图?的主要内容,如果未能解决你的问题,请参考以下文章
创建返回具有复杂 SQL 的表的 Oracle 视图或过程,是不是可能以及如何?