【问题标题】:Select Statement on Two different views选择关于两种不同观点的声明
【发布时间】:2015-06-22 14:36:10
【问题描述】:

我在任何地方都找不到特定问题的答案。

是否可以从两个不同的视图中进行选择?例如,我的代码看起来像这样。

select view1.col1, view1.col2, view1.col3
from dbo.view1
inner join ~~~~~
inner join ~~~~~

但我想在同一个查询中包含来自不同视图的列。

select view1.co1, view1.col2, view1.col3, view2.col1
from dbo.view1,
     dbo.view2 (this is the line im not sure is possible or allowed)
inner join ~~~~~~
inner join ~~~~~

是否可以将不同的视图用作我的一个 select 语句的源,或者这在 SQL 中是不可能的?

我使用 SQL Server 作为我的数据库引擎。

【问题讨论】:

  • 视图或表无所谓,像以前一样加入即可。
  • 避免使用from dbo.view1, dbo.view2 之类的语法。这是一个 ANSI-89 JOIN,应该替换为更详细的 ANSI-92 样式 JOIN
  • 为什么我的这个问题得了-1?只是这样我以后可以改进我的其他问题。
  • 你的数据库引擎是什么? SQL Server 或 MYSQL 或其他东西
  • 我相信是SQL Server,但是这个问题已经解决了

标签: sql


【解决方案1】:

是的,您可以在 SELECT 查询中使用两个不同的视图。如果它们彼此匹配列,则必须加入它们。

在 SELECT 子句中使用时,只需将两个不同的视图视为两个不同的表。

SELECT vw1.a, vw2.b
FROM View1 vw1 INNER JOIN View2 vw2
     ON vw1.id = vw2.id

为了澄清,可以将视图视为虚拟表或存储查询。用户可以通过引用 Transact-SQL 语句中的视图名称来使用此虚拟表,方法与引用表的方式相同。

编辑

Select vw1.username, vw2.usertype 
From vw1 INNER JOIN vw2 
         ON vw1.colID = vw2.colID  <<<< Here you have to use 
                                   <<<< common column between two views to matched rows

【讨论】:

  • 那么,如果该列仅存在于一个视图中并且我想将其添加到结果查询中怎么办?就像这样:select vw1.username, vw2.usertype from vw1.users 如何包含 vw2 以便获取 usertype?
  • 在这种情况下,您在公共列上使用了 vw1 和 vw2 之间的 Join,然后在选择查询中使用 vw2.usertype。见编辑
  • @Jon:- 你使用的是哪个数据库?
  • C 和 SQL 是两种不同的语言,它们都有不同的语法来做这些事情。你可以使用 msdn.microsoft.com/en-us/library/ms187956.aspxmsdn.microsoft.com/en-us/library/h09t6a82(v=vs.80).aspx 来了解更多关于视图的信息
  • 再想一想,你说的是这个 Select vw1.username, vw2.usertype ,这里指定了 vw2 ,但是实际执行是从 FROM 子句开始的,而不是从 SELECT 开始的
【解决方案2】:

当涉及到SELECT 时,视图仅适用于常规(基本)表。 JOIN 和以前一样:

select view1.co1, view1.col2, view1.col3, view2.col1
from dbo.view1
inner join dbo.view2 ON ~~~~~
inner join ~~~~~~
inner join ~~~~~

【讨论】:

    【解决方案3】:

    你应该使用加入

    select view1.col1, view1.col2, view1.col3, view2.newColumn
    from dbo.view1
    inner join dbo.view2 on <key> = <key>;
    

    这只是为了清除您的理解,正如我从您的示例中看到的那样

    from dbo.view1,
         dbo.view2 (this is the line im not sure is possible or allowed)
    inner join ~~~~~
    

    你无法理解它是如何工作的,我上面的例子是这个 Join 和下面这个表单,你应该避免使用旧的技术

      select view1.col1, view1.col2, view1.col3, view2.newColumn
       from dbo.view1, dbo.view2
       where view1.key = view2.key
    

    谢谢,祝你好运

    【讨论】:

    • 您应该避免使用 ANSI-89 JOINs。此语法已弃用。 stackoverflow.com/questions/1613304/…
    • 是的,我知道为什么我写了“你应该使用 Join”
    • @jarlh 抱歉,我应该指定,自 2008 年以来 Microsoft SQL Server 中已弃用 ANSI-89 连接。其他 RDBMS 可能更宽松。我同意你的看法,不管是坏习惯。
    • 这不是一个建议,它只是一个解释,正如你在上面的代码中看到的,他不知道什么是尊重以及它是如何工作的from dbo.view1, dbo.view2 (this is the line im not sure is possible or allowed) inner join ~
    • @我根本不会包含它。 Microsoft 正在禁用 SQL Server 2012 中的一些 ANSI-89 OUTER JOIN 功能,并且可能会继续该过程。我知道还有其他 RDBMS 仍然允许 ANSI-89 JOIN,但使用 ANSI-92 JOIN 有很多优点。除非有人问旧语法是什么意思,否则我认为作为一个社区,我们不应该继续挖掘它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2019-09-11
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多