【问题标题】:Use SQL query with a join clause in a view在视图中使用带有连接子句的 SQL 查询
【发布时间】:2012-10-18 00:19:10
【问题描述】:

是否可以创建一个模拟下面的选择查询的数据库视图?

select
 A.Name,
 B.Subscription
from
 TestTableA as A left outer join TestTableB as B on A.ID = B.A_ID and Subscription = 'xxxx';

在视图中,我看不到如何在连接子句中过滤订阅,而只能将其作为查询的 where 子句的条件。

(这个question 的一个更复杂的版本)。

更新:

测试表A

ID | Name
---|------
 1 | Joe
 2 | Jane

测试表B

ID | A_ID | Subscription
---|------|-------------
 1 | 1    | abcd
 2 | 1    | efgh

查询结果:

使用上面的“select”语句,结果集是:

Name | Subscription
-----|-------------
Joe  | null
Jane | null  

我想要实现的是创建一个返回相同内容的视图。

select * from MyView where Subscription is null Subscription = 'xxxx';

目前我只能通过视图实现,上面的查询如下。我无法通过 null 订阅将“Joe”加入结果中。

Name | Subscription
-----|-------------
Jane | null 

【问题讨论】:

  • 这个话题和你的其他话题有什么区别?
  • 这是一个更简单、更具体的问题。
  • 你能编辑你原来的问题吗?

标签: mysql outer-join sql-view


【解决方案1】:

我找到了一种在视图中使用联合的方法。

create or replace view TestView as
  select
   A.Name,
   null as Subscription
  from
    TestTableA as A left outer join TestTableB as B on A.ID = B.A_ID
  union
   select
    A.Name,
    B.Subscription
  from
   TestTableA as A left outer join TestTableB as B on A.ID = B.A_ID;

然后使用下面的语句查询视图给了我想要的结果:

 select * from TestView where Subscription is null or Subscription = 'xxxx';

【讨论】:

  • 这仍然不等效,并且可能不会在所有情况下都生成您想要的结果。考虑以下结果时的结果: select * from TestView where Subscription is null or Subscription = 'efgh';请参阅以下 sqlfiddle:sqlfiddle.com/#!2/07099/2
  • 我同意它不等同,但它是我能想到的最接近的。这意味着在应用程序的业务层代码中进行额外的工作,但这总比不获取所有记录要好。
  • 如果视图只是混淆了真正的逻辑,为什么还要使用它呢?只需使用应用程序中的直接外部联接,而不是具有不同含义的视图。您甚至可以将其隐藏在采用“xxxx”参数的层(在您的应用程序中)后面,将其用作实际外部连接中的参数,然后将结果返回给调用者。有些问题最好在应用程序中解决,有些问题在数据库中解决。替代跟随...
  • 另一种方法是使用一个称为准备好的语句的概念,其中 JOIN 逻辑将这样编写: t1 LEFT JOIN t2 ON t1.blah = t2.blah AND t2.subscription = ?;对于每个请求,应用程序将一个参数绑定到 (?) 参数,然后执行该语句。语句的形式不会改变,只是绑定的参数会改变。
  • 我已经在我的应用程序中有效地使用了直接外连接,但是因为它是在实体框架下调用的,所以整体查询变得太慢了。通过使用视图,我可以手动优化查询并加快速度。不幸的是,所需的逻辑仍然被证明太笨重而无法放入视图中,并且存储过程将意味着没有使用 where 子句的服务器端过滤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多