Sql 有效查询,查看失败

Sql 有效查询,查看失败,sql,view,db2,Sql,View,Db2,我遇到了一些DB2SQL问题,需要一些帮助 简而言之,人们希望我创建一个视图。我写了一个有效的查询并返回我们想要的。。。但是当我用“createview”语句包装它时,当我用任何东西查询它时,视图会抛出错误 查询名称已明显更改: SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link" FROM (( SELECT * FROM db.schema.VT

我遇到了一些DB2SQL问题,需要一些帮助

简而言之,人们希望我创建一个视图。我写了一个有效的查询并返回我们想要的。。。但是当我用“createview”语句包装它时,当我用任何东西查询它时,视图会抛出错误

查询名称已明显更改:

SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
 FROM (( 
SELECT * FROM db.schema.VTable) 
 "QTable" LEFT OUTER JOIN (SELECT * FROM db.schema.ETable) 
"QStat" on "QTable"."Status" = "QStat"."ETable") 
每运行一次,我都会得到10张唱片。太棒了,这就是我想要的。当我将其包装为视图时,我通过输入:

CREATE VIEW TestSchema.TestTable AS
SELECT * FROM ( *query I just wrote above*)
它运行得非常快,但是我运行了一个基本的SELECT*FROM viewname,我总是会得到相同的错误:

SQL0206N  "QTable.Status" is not valid in the context where it is used. SQLSTATE=42703
我已经被困了一段时间了。我假设我创建的视图是错误的。有什么想法吗?小费


编辑:DB211.1

我将去掉几乎所有的方括号和引号。我怀疑它们不是必需的,除非DB2是非常非标准的sql。我留下了引号,尽管我也会把所有的引号都去掉,除非它们是保留字

没有理由执行类似于从表中选择*的操作

查询应该是:

SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
FROM db.schema.VTable QTable 
LEFT OUTER JOIN  db.schema.ETable "QStat" on "QTable"."Status" = "QStat"."ETable"
create view myView as
SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
FROM db.schema.VTable QTable 
LEFT OUTER JOIN  db.schema.ETable "QStat" on "QTable"."Status" = "QStat"."ETable"
您的视图也不应被创建为“选择*自…”。。。应该是:

SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
FROM db.schema.VTable QTable 
LEFT OUTER JOIN  db.schema.ETable "QStat" on "QTable"."Status" = "QStat"."ETable"
create view myView as
SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
FROM db.schema.VTable QTable 
LEFT OUTER JOIN  db.schema.ETable "QStat" on "QTable"."Status" = "QStat"."ETable"

我会去掉所有括号和引号。我怀疑它们不是必需的,除非DB2是非常非标准的sql。我留下了引号,尽管我也会把所有的引号都去掉,除非它们是保留字

没有理由执行类似于从表中选择*的操作

查询应该是:

SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
FROM db.schema.VTable QTable 
LEFT OUTER JOIN  db.schema.ETable "QStat" on "QTable"."Status" = "QStat"."ETable"
create view myView as
SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
FROM db.schema.VTable QTable 
LEFT OUTER JOIN  db.schema.ETable "QStat" on "QTable"."Status" = "QStat"."ETable"
您的视图也不应被创建为“选择*自…”。。。应该是:

SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
FROM db.schema.VTable QTable 
LEFT OUTER JOIN  db.schema.ETable "QStat" on "QTable"."Status" = "QStat"."ETable"
create view myView as
SELECT DISTINCT "QTable"."Add" "Q_Add", "QTable"."Approved" "Q_Approved", "QTable"."Link" "Q_Link"
FROM db.schema.VTable QTable 
LEFT OUTER JOIN  db.schema.ETable "QStat" on "QTable"."Status" = "QStat"."ETable"

你可能有不同的问题。我刚刚在DB2 10.5中试用过,效果很好:

create table vtable (
  "Add" int,
  "Approved" int,
  "Link" varchar(20),
  "Status" int
);

create table etable (
  "ETable" int
);

create view my_view1 as
select
  *
from
  (
    SELECT
      DISTINCT "QTable"."Add" "Q_Add",
      "QTable"."Approved" "Q_Approved",
      "QTable"."Link" "Q_Link"
    FROM
      (
          ( SELECT * FROM VTable) "QTable"
          LEFT OUTER JOIN
          (
            SELECT
              *
            FROM ETable
          )
          "QStat" on "QTable"."Status" = "QStat"."ETable"
      )
  )
无论如何,你的括号太多了。去掉那些你不需要的


而QTable需要始终使用双引号,就像在QTable中一样。

您可能会遇到不同的问题。我刚刚在DB2 10.5中试用过,效果很好:

create table vtable (
  "Add" int,
  "Approved" int,
  "Link" varchar(20),
  "Status" int
);

create table etable (
  "ETable" int
);

create view my_view1 as
select
  *
from
  (
    SELECT
      DISTINCT "QTable"."Add" "Q_Add",
      "QTable"."Approved" "Q_Approved",
      "QTable"."Link" "Q_Link"
    FROM
      (
          ( SELECT * FROM VTable) "QTable"
          LEFT OUTER JOIN
          (
            SELECT
              *
            FROM ETable
          )
          "QStat" on "QTable"."Status" = "QStat"."ETable"
      )
  )
无论如何,你的括号太多了。去掉那些你不需要的


QTable需要始终用双引号括起来,就像在QTable中一样。

什么版本的DB2?DB2 11.1在描述中添加了它。确保QTable始终用双引号括起来,就像在QTable中一样。请看我的回答。我被迫更改查询,这样它就可以工作了。你错过了一个案例。哦,对不起,这是在我的SQL中引用的。QTable位于左外部联接之前的右侧。当我运行Tomc的代码而不是我的或你的代码时,我不知道为什么它会起作用。是什么版本的DB2?DB2 11.1,在描述中添加了它。确保QTable总是在双引号之间写入,就像QTable一样。请看我的回答。我被迫更改查询,这样它就可以工作了。你错过了一个案例。哦,对不起,这是在我的SQL中引用的。QTable位于左外部联接之前的右侧。我不知道当我运行Tomc的代码而不是我的或你的代码时,它为什么会起作用。是的,DB2大部分时间都使用标准SQL语法,因此查询将从您所展示的简化中受益匪浅。向上投票。好的,我试试看。另外,我试着做了你提到的第二个技巧,并删除了SELECT*FROM。。。它似乎是多余的,但没有修复任何东西。所以它起作用了。。。但我不能完全确定原因。另外,我为这段非常难看的代码道歉。我不是SQL的高手,我的SQL的很多内容都来自一个帮助我为表生成SQL的程序。这也很可怕。。因为我有23个表要做这些更改,有些是500行。无论如何,非常感谢您,如果您能想到原因,为什么要更改和简化它?是的,DB2大部分时间都使用标准SQL语法,因此查询将从您展示的简化中受益匪浅。向上投票。好的,我试试看。另外,我试着做了你提到的第二个技巧,并删除了SELECT*FROM。。。它似乎是多余的,但没有修复任何东西。所以它起作用了。。。但我不能完全确定原因。另外,我为这段非常难看的代码道歉。我不是SQL的高手,我的SQL的很多内容都来自一个帮助我为表生成SQL的程序。这也很可怕。。因为我有23个表要做这些更改,有些是500行。不管怎样,非常感谢你,如果你能想到原因,为什么要改变和简化它?