【问题标题】:How to use WHERE in VIEW?如何在 VIEW 中使用 WHERE?
【发布时间】:2020-03-15 07:59:25
【问题描述】:

在数据库的 myView 中,我有:

 SELECT orderhdr3_.id AS col_0_0_,
    gnrlorg2_.id AS col_1_0_,
    gnrlorg2_.name AS col_2_0_,
    gnrlcustom1_.id AS col_3_0_,
    gnrlcustom1_.name AS col_4_0_,
    orderhdr3_.order_no AS col_5_0_,
    orderhdr3_.cust_ref_no AS col_6_0_,
    tripinfo4_.job_no AS col_7_0_,
    orderhdr3_.order_type AS col_8_0_,
    servicetyp5_.code AS col_9_0_,
    tripinfo4_.service_provider_id AS col_10_0_,
    tripinfo4_.service_personnel AS col_11_0_,
    orderhdr3_.status AS col_12_0_,
    orderhdr3_.completed_date AS col_13_0_,
    orderhdr3_.reason_code AS col_14_0_,
    orderhdr3_.remarks AS col_15_0_,
    orderhdr3_.source_order_hdr_location_id AS col_16_0_,
    orderhdrlo7_.unit_no AS col_17_0_,
    orderhdrlo7_.name AS col_18_0_,
    orderhdrlo7_.address AS col_19_0_,
    orderhdrlo7_.postal_code AS col_20_0_,
    orderhdrlo7_.zone AS col_21_0_,
    orderhdrlo7_.contact AS col_22_0_,
    orderhdrlo7_.phone AS col_23_0_,
    orderhdrlo7_.email AS col_24_0_,
    orderhdrlo7_.op_date AS col_25_0_,
    orderhdrlo7_.instruction AS col_26_0_,
    orderhdr3_.dest_order_hdr_location_id AS col_27_0_,
    orderhdrlo6_.unit_no AS col_28_0_,
    orderhdrlo6_.name AS col_29_0_,
    orderhdrlo6_.address AS col_30_0_,
    orderhdrlo6_.postal_code AS col_31_0_,
    orderhdrlo6_.zone AS col_32_0_,
    orderhdrlo6_.contact AS col_33_0_,
    orderhdrlo6_.phone AS col_34_0_,
    orderhdrlo6_.email AS col_35_0_,
    orderhdrlo6_.op_date AS col_36_0_,
    orderhdrlo6_.instruction AS col_37_0_,
    orderdet11_.product_code AS col_39_0_,
    orderdet11_.product_desc AS col_40_0_,
    orderdet11_.order_qty AS col_41_0_,
    orderdet11_.serviced_qty AS col_42_0_,
    orderdet11_.reason_code AS col_43_0_,
    orderhdr3_.active_ind AS col_44_0_,
    tripinfo4_.active_ind AS col_45_0_,
    gnrlorg2_.active_ind AS col_46_0_,
    gnrlcustom1_.active_ind AS col_47_0_,
    commusersc0_.comm_user_id AS col_48_0_,
    orderhdr3_.org_id AS col_49_0_,
    orderhdr3_.customer_id AS col_50_0_,
    orderhdrlo6_.op_date AS col_51_0_,
    orderhdrlo6_.op_date AS col_52_0_,
    orderhdr3_.id AS col_53_0_,
    orderdet11_.order_hdr_id AS col_54_0_,
    orderhdrlo6_.op_date AS col_55_0_,
    tripinfo4_.job_no AS col_56_0_,
    orderhdr3_.seq AS col_57_0_,
    orderhdr3_.order_no AS col_58_0_
   FROM comm_users_customers commusersc0_
     JOIN gnrl_customer gnrlcustom1_ ON commusersc0_.gnrl_customer_id = gnrlcustom1_.id
     JOIN gnrl_org gnrlorg2_ ON gnrlcustom1_.gnrl_org_id = gnrlorg2_.id
     CROSS JOIN order_det orderdet11_
     JOIN order_hdr orderhdr3_ ON gnrlcustom1_.id = orderhdr3_.customer_id
     JOIN trip_info tripinfo4_ ON orderhdr3_.trip_info_id = tripinfo4_.id
     JOIN service_type servicetyp5_ ON orderhdr3_.service_type_id = servicetyp5_.id
     JOIN order_hdr_location orderhdrlo6_ ON orderhdr3_.dest_order_hdr_location_id = orderhdrlo6_.id
     JOIN order_hdr_location orderhdrlo7_ ON orderhdr3_.source_order_hdr_location_id = orderhdrlo7_.id
     JOIN order_hdr_location_time_windows timewindow8_ ON timewindow8_.order_hdr_location_id = orderhdr3_.dest_order_hdr_location_id
     JOIN order_hdr_location orderhdrlo9_ ON timewindow8_.order_hdr_location_id = orderhdrlo9_.id;

在我的代码中,我想使用 WHERE 进行过滤

SELECT * FROM myView view WHERE view.order_no = ?

但是 Java/PostgreSQL 给出错误:

错误:view.order_no 列不存在

请帮忙,因为这很复杂,因为它涉及多个表和很多列。我不确定为什么 view.order_no 不存在,因为它是在 col_5_0 中选择的

【问题讨论】:

  • SQL 应该如何通过从视图中选择来知道涉及哪些表?如果视图的列被命名为id,那么要么写... WHERE id = ?要么... WHERE myView.id = ?
  • SELECT * FROM .. WHERE col_5_0_ = ?
  • 显然在视图的查询中没有列名或别名为order_no
  • 我试过 WHERE col_5_0 = ?但不是成功。请帮忙。谢谢
  • order_no 已重命名为 col_5_0_(不是 col_5_0)。但是这些别名毫无意义。您应该使用可读和可理解的列别名重新创建您的视图。

标签: sql database postgresql view


【解决方案1】:

您可以通过名称引用视图:

SELECT * FROM myView WHERE id = ?

另外view是sql中的关键字。

【讨论】:

  • 我试过了。它说列 view.id 不存在。请帮忙。谢谢。
  • @Shazam 您可以将整个视图定义粘贴到问题中吗?
  • 我已经粘贴了整个视图。请帮忙。谢谢。
  • @Shazam 立即尝试
  • 还是不行。我试过 WHERE myView.order_no 但没有工作。请帮忙。谢谢
【解决方案2】:

您已将列order_no 重命名为col_5_0_。所以你需要使用它:

SELECT *
FROM myView v
WHERE v.col_5_0_ = ?;

也就是说,您只能引用视图返回的列。

将列重命名为无意义的字符串似乎是一个非常糟糕的主意——至少如果视图暴露给人类的话。我不清楚为什么有人想要混淆它们。

另外,不要使用view 作为表别名(或任何其他标识符)。它是一个 SQL 关键字,最好避免将其作为标识符。

【讨论】:

    【解决方案3】:

    以这种方式创建您的视图并在 where 子句中使用视图引用

    CREATE VIEW view_name 
    AS
        SELECT column1, column2, ...
        FROM table_name
        WHERE condition;
    

    您还可以在视图创建期间过滤行。

    SELECT * 
    FROM view_name 
    WHERE view_name.col_name = ?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多