| <?xml version="1.0" encoding="UTF-8"?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| --> |
| <!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd"> |
| <concept rev="1.1" id="with"> |
| |
| <title>WITH Clause</title> |
| <prolog> |
| <metadata> |
| <data name="Category" value="Impala"/> |
| <data name="Category" value="SQL"/> |
| <data name="Category" value="Querying"/> |
| <data name="Category" value="Developers"/> |
| <data name="Category" value="Data Analysts"/> |
| </metadata> |
| </prolog> |
| |
| <conbody> |
| |
| <p> |
| A clause that can be added before a <codeph>SELECT</codeph> statement, to define aliases for complicated |
| expressions that are referenced multiple times within the body of the <codeph>SELECT</codeph>. Similar to |
| <codeph>CREATE VIEW</codeph>, except that the table and column names defined in the <codeph>WITH</codeph> |
| clause do not persist after the query finishes, and do not conflict with names used in actual tables or |
| views. Also known as <q>subquery factoring</q>. |
| </p> |
| |
| <p> |
| You can rewrite a query using subqueries to work the same as with the <codeph>WITH</codeph> clause. The |
| purposes of the <codeph>WITH</codeph> clause are: |
| </p> |
| |
| <ul> |
| <li> |
| Convenience and ease of maintenance from less repetition with the body of the query. Typically used with |
| queries involving <codeph>UNION</codeph>, joins, or aggregation functions where the similar complicated |
| expressions are referenced multiple times. |
| </li> |
| |
| <li> |
| SQL code that is easier to read and understand by abstracting the most complex part of the query into a |
| separate block. |
| </li> |
| |
| <li> |
| Improved compatibility with SQL from other database systems that support the same clause (primarily Oracle |
| Database). |
| <note> |
| <p> |
| The Impala <codeph>WITH</codeph> clause does not support recursive queries in the |
| <codeph>WITH</codeph>, which is supported in some other database systems. |
| </p> |
| </note> |
| </li> |
| </ul> |
| |
| <p conref="../shared/impala_common.xml#common/sql1999"/> |
| |
| <p conref="../shared/impala_common.xml#common/example_blurb"/> |
| |
| <codeblock>-- Define 2 subqueries that can be referenced from the body of a longer query. |
| with t1 as (select 1), t2 as (select 2) insert into tab select * from t1 union all select * from t2; |
| |
| -- Define one subquery at the outer level, and another at the inner level as part of the |
| -- initial stage of the UNION ALL query. |
| with t1 as (select 1) (with t2 as (select 2) select * from t2) union all select * from t1;</codeblock> |
| </conbody> |
| </concept> |