创建具有多个表的视图?

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 视图或过程,是不是可能以及如何?

如何从多个表的多行创建视图?

MS Access VBA:创建具有多个工作表的 Excel 工作簿

如何在另一个数据库中的多个数据库中创建多个表的单个视图?

创建具有多个对象/层的视图 [关闭]

多个表的视图使网站变慢