可能重复:
CTE和SubQuery之间的区别?
我试图了解如何使用该WITH条款和该条款的目的WITH.
我理解的只是,该WITH条款取代了正常的子查询.
任何人都可以通过一个小例子详细解释这个问题吗?
我正在将我的所有SQL Server查询转换为MySQL,并且我的查询WITH都失败了.这是一个例子:
WITH t1 AS
(
SELECT article.*, userinfo.*, category.*
FROM question
INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid
INNER JOIN category ON article.article_categoryid = category.catid
WHERE article.article_isdeleted = 0
)
SELECT t1.*
FROM t1
ORDER BY t1.article_date DESC
LIMIT 1, 3
Run Code Online (Sandbox Code Playgroud) mysql common-table-expression with-clause subquery-factoring mysql-8.0
我试图在Postgres 9.1.3中使用此查询:
WITH stops AS (
SELECT citation_id,
rank() OVER (ORDER BY offense_timestamp,
defendant_dl,
offense_street_number,
offense_street_name) AS stop
FROM consistent.master
WHERE citing_jurisdiction=1
)
UPDATE consistent.master
SET arrest_id = stops.stop
WHERE citing_jurisdiction=1
AND stops.citation_id = consistent.master.citation_id;
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ERROR: missing FROM-clause entry for table "stops"
LINE 12: SET arrest_id = stops.stop
^
********** Error **********
ERROR: missing FROM-clause entry for table "stops"
SQL state: 42P01
Character: 280
Run Code Online (Sandbox Code Playgroud)
我真的很困惑.根据Postgres文档,WITH子句显示正确.如果我在WITH子句中单独运行查询,我会得到正确的结果.
当我在我的一个脚本中使用WITH子句时,我遇到了一个问题.这个问题很容易指出我想多次使用CTE别名,而不仅仅是在外部查询中,并且存在症结.
例如:
-- Define the CTE expression
WITH cte_test (domain1, domain2, [...])
AS
-- CTE query
(
SELECT domain1, domain2, [...]
FROM table
)
-- Outer query
SELECT * FROM cte_test
-- Now I wanna use the CTE expression another time
INSERT INTO sometable ([...]) SELECT [...] FROM cte_test
Run Code Online (Sandbox Code Playgroud)
最后一行将导致以下错误,因为它在外部查询之外:
消息208,级别16,状态1,行12无效的对象名称'cte_test'.
有没有办法多次使用CTE.让它持久?我目前的解决方案是创建一个临时表,我存储CTE的结果,并将此临时表用于任何进一步的语句.
-- CTE
[...]
-- Create a temp table after the CTE block
DECLARE @tmp TABLE (domain1 DATATYPE, domain2 DATATYPE, [...])
INSERT INTO @tmp (domain1, domain2, [...]) SELECT domain1, …Run Code Online (Sandbox Code Playgroud) 我可以这样做:
with t as
(
with tt as
(
select * from table
)
SELECT * FROM tt
)
select * from t
Run Code Online (Sandbox Code Playgroud)
我愿意对inner with子句的输出执行一些逻辑,而不是再对外部with子句的输出执行一些操作.
任何帮助将不胜感激...
谢谢
注意: - 它只是一些简化的查询,将在我的实际查询中解决我的问题,它有嵌套的子句
我不明白在Neo4j中做什么WITH子句.我阅读了The Neo4j Manual v2.2.2,但对于WITH子句并不十分清楚.没有很多例子.例如,我有以下图表,其中蓝色节点是足球队,黄色是他们的体育场.

我想找到两个或更多球队比赛的体育场馆.我发现查询并且它有效.
match (n:Team) -[r1:PLAYS]->(a:Stadium)
with a, count(*) as foaf
where foaf > 1
return a
Run Code Online (Sandbox Code Playgroud)
count(*)告诉我们匹配行的数量.但我不明白WITH子句的作用.
我正在尝试使用 WITH 子句创建持久表,但是出现错误。
对于上下文,我目前找到的答案是
CREATE TABLE my_table
AS
WITH my_tables_data AS (
SELECT another_table.data1 AS some_value
FROM another_table
)
SELECT *
FROM some_data;
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误
消息 319,级别 15,状态 1,第 5 行 关键字“with”附近的语法不正确。如果此语句是公共表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前一条语句必须以分号终止。
我的代码是
CREATE TABLE SalesOrdersPerYear
WITH t1 AS (
-- Define the CTE expression name and column list.
WITH Sales_CTE (SalesPersonID, BaseSalary)
AS
-- Define the CTE query.
(
SELECT SALES_PERSON.SALES_PERSON_ID, SALES_PERSON.BASE_SALARY
FROM SALES_PERSON
WHERE SALES_PERSON_ID IS NOT NULL
)
-- Define the outer query referencing the CTE name. …Run Code Online (Sandbox Code Playgroud) WITH dept_count AS (
SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT e.ename AS employee_name,
dc.dept_count AS emp_dept_count
FROM emp e,
dept_count dc
WHERE e.deptno = dc.deptno;
Run Code Online (Sandbox Code Playgroud)
我们如何将从上面的查询中检索到的数据(意味着由于使用WITH CLAUSE而创建的临时表dept_count)映射到以下java类?
我的 Java 类具有以下属性:employee_name、emp_dept_count。
如何编写 JOOQ 查询来连接“with”子句中的字段?
例如,我尝试过:
create.with("a").as(select(
val(1).as("x"),
val("a").as("y")
))
.select()
.from(tableByName("a")
.join(ANOTHER_TABLE)
.on(ANOTHER_TABLE.ID.eq(tableByName("a").field("x")))
.fetch();
Run Code Online (Sandbox Code Playgroud)
但是,由于编译器不知道 tableByName("a").field("x") 的类型,因此无法解析要使用哪个 eq() 方法。鉴于我知道类型,有没有办法可以明确提供它?或者我应该采取另一种方法从“with”子句加入字段?
用外行术语来说,WITH子句和临时表之间的主要区别是什么?
在哪种情况下最好使用一种?
我正在尝试在查询中使用WITH子句,但一直收到消息
ORA-00942:表或视图不存在
我试图创建一个简单的查询,仅作为此处的示例:
WITH
test AS
(
SELECT COUNT(Customer_ID)FROM Customer
)
SELECT * FROM test;
但是即使这样也行不通,它只是给出以下信息:
SELECT * FROM test; 2 3 4 5 6 SQL>
SELECT * FROM test
*第1行出现错误:
ORA-00942:表或视图不存在
我以前从未使用过WITH子句,这里缺少一些简单的东西吗?我正在使用Oracle数据库10g企业版10.2.0.1.0版-产品请提供任何建议。谢谢。
查询语句:
WITH joined AS (
SELECT *
FROM table_a a
JOIN table_b b ON (a.a_id = b.a_id)
)
SELECT a_id
FROM joined
Run Code Online (Sandbox Code Playgroud)
返回无效标识符。
使用 WITH 子句时如何选择连接列?我尝试过别名、前缀,但没有任何效果。我知道我可以使用:
WITH joined AS (
SELECT a.a_id
FROM table_a a
JOIN table_b b ON (a.a_id = b.a_id)
)
SELECT a_id
FROM joined
Run Code Online (Sandbox Code Playgroud)
但我需要这个别名来覆盖所有领域。
我设法满足此条件的唯一方法是使用:
WITH joined AS (
SELECT a.a_id a_id_alias, a.*, b.*
FROM table_a a
JOIN table_b b ON (a.a_id = b.a_id)
)
SELECT a_id_alias
FROM joined
Run Code Online (Sandbox Code Playgroud)
但这不是完美的解决方案......
with-clause ×12
sql ×10
oracle ×2
sql-server ×2
hibernate ×1
java ×1
join ×1
jooq ×1
mysql ×1
mysql-8.0 ×1
neo4j ×1
ora-00942 ×1
postgresql ×1
t-sql ×1
temp-tables ×1