我在一张桌子上有一个树木结构.该表是一个可以无限嵌套的类别树.每个类别都有一个ProductCount列,用于说明该类别中有多少产品(不是对子类别求和).
Id | ParentId | Name | ProductCount
------------------------------------
1 | -1 | Cars | 0
2 | -1 | Bikes | 1
3 | 1 | Ford | 10
4 | 3 | Mustang | 7
5 | 3 | Focus | 4
Run Code Online (Sandbox Code Playgroud)
我想做一个SQL查询,每个行/类别给我产品的数量,包括子类别中的产品.
上表的输出应该是
Id | ParentId | Name | ProductCount | ProductCountIncludingChildren
--------------------------------------------------------------------------
1 | -1 | Cars | 0 | 21
2 | -1 | Bikes | 1 | 1
3 | 1 | Ford | …Run Code Online (Sandbox Code Playgroud) 我的存储过程如下:
WITH MYCTE(....)
AS
(
...
)
UPDATE ... (using my CTE)
DELETE ( using my CTE) <--- says the object, my CTE, doesn't exist
Run Code Online (Sandbox Code Playgroud)
我可以只使用一次吗?
我正在尝试使用PostgreSQL 9.1.3学习SQL.我想了解一些让我觉得不一致的行为.以机智:
这有效:
WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;
Run Code Online (Sandbox Code Playgroud)
我明白了:
?column?
----------
2
3
Run Code Online (Sandbox Code Playgroud)
这有效:
WITH outmost AS (
(WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
Run Code Online (Sandbox Code Playgroud)
结果:
?column?
----------
2
Run Code Online (Sandbox Code Playgroud)
这也有效:
WITH outmost AS (
SELECT 1
UNION (WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
Run Code Online (Sandbox Code Playgroud)
我明白了:
?column?
----------
1
2
Run Code Online (Sandbox Code Playgroud)
但是,这并不能正常工作:
WITH outmost AS (
SELECT 1
UNION …Run Code Online (Sandbox Code Playgroud) 考虑以下简单的DAG:
1->2->3->4
Run Code Online (Sandbox Code Playgroud)
还有一个表#bar,描述了这个(我正在使用SQL Server 2005):
parent_id child_id
1 2
2 3
3 4
//... other edges, not connected to the subgraph above
Run Code Online (Sandbox Code Playgroud)
现在假设我有一些其他任意标准来选择第一个和最后一个边,即1-> 2和3-> 4.我想用这些来查找我的图表的其余部分.
我可以写一个递归CTE如下(我使用的是MSDN中的术语):
with foo(parent_id,child_id) as (
// anchor member that happens to select first and last edges:
select parent_id,child_id from #bar where parent_id in (1,3)
union all
// recursive member:
select #bar.* from #bar
join foo on #bar.parent_id = foo.child_id
)
select parent_id,child_id from foo
Run Code Online (Sandbox Code Playgroud)
但是,这会导致边缘3-> 4被选中两次:
parent_id child_id
1 2
3 4
2 …Run Code Online (Sandbox Code Playgroud) 我在表中有一组具有id的行.我试图在多列的行中展平它.我几乎可以肯定我用cte和也许分区完成了这个.
我用cte来删除重复的数据,我以为我做了类似于我想要完成的事情.我能够提出可行的解决方案(如下所列),但仍然觉得应该有更优雅的解决方案.
CREATE TABLE #MyTable ( RowID int , field VARCHAR(10), value VARCHAR(10))
INSERT INTO #MyTable ( RowID, field, value ) VALUES ( 1, 'first', 'neil' )
INSERT INTO #MyTable ( RowID, field, value ) VALUES ( 2, 'first', 'bob' )
INSERT INTO #MyTable ( RowID, field, value ) VALUES ( 3, 'first', 'tom' )
INSERT INTO #MyTable ( RowID, field, value ) VALUES ( 1, 'last', 'young' )
INSERT INTO #MyTable ( RowID, field, value ) VALUES ( 2, …Run Code Online (Sandbox Code Playgroud) 使用CTE's(common table expressions)而不是使用是否有好处temp tables.
我在两者之间进行了性能测试,但我发现它们之间没有太大区别.
使用的优点和缺点是CTE'S什么?
sql t-sql temp-tables common-table-expression sql-server-2008-r2
我试图通过使用dblink through函数从远程数据库获取数据,但收到错误"查询没有结果数据的目标".我使用plpgsql语言做同样的事情.
功能:
CREATE OR REPLACE FUNCTION fun()
RETURNS text AS
$$
begin
select dblink_connect(
'port=5432 dbname=test user=postgres password=****');
WITH a AS (
SELECT *
FROM dblink(
'SELECT slno,fname,mname,lname
FROM remote_tbl'
) AS t (slno int, fname text, mname text, lname text)
)
, b AS (
INSERT INTO temptab1
SELECT slno, name
FROM a
)
, c AS (
INSERT INTO temptab2
SELECT slno, name
FROM a
)
INSERT INTO temptab3
SELECT slno, name
FROM a;
select dblink_disconnect(); …Run Code Online (Sandbox Code Playgroud) 我有两个以下表格的表格(即每个foo都链接到一个条形图).
CREATE TABLE foo (
id INTEGER PRIMARY KEY,
x INTEGER NOT NULL,
y INTEGER NOT NULL,
...,
bar_id INTEGER UNIQUE NOT NULL,
FOREIGN key (bar_id) REFERENCES bar(id)
);
CREATE TABLE bar (
id INTEGER PRIMARY KEY,
z INTEGER NOT NULL,
...
);
Run Code Online (Sandbox Code Playgroud)
foo使用嵌套查询复制满足特定条件的行很容易:
INSERT INTO foo (...) (SELECT ... FROM foo WHERE ...)
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何bar为每一行制作相关行的副本foo并将id bar插入新foo行.有没有办法在单个查询中执行此操作?
期望结果的具体例子:
-- Before query:
foo(id=1,x=3,y=4,bar_id=100) ..... bar(id=100,z=7)
foo(id=2,x=9,y=6,bar_id=101) ..... bar(id=101,z=16)
foo(id=3,x=18,y=0,bar_id=102) ..... bar(id=102,z=21)
-- Query copies …Run Code Online (Sandbox Code Playgroud) 我有一个关于SQL Server中的公用表表达式的性能问题.在我们的开发团队中,我们在构建查询时使用了很多链式CTE.我目前正在处理一个性能很糟糕的查询.但我发现,如果我在链的中间将所有记录插入临时表中的CTE,然后继续,但从该临时表中选择,我显着提高了性能.现在,我希望得到一些帮助,以了解这种类型的更改是否仅适用于此特定查询以及为什么您将在下面看到的两种情况在性能上有很大差异.或者我们是否可能过度使用我们团队中的CTE,我们是否可以通过学习这个案例来获得性能?
请尝试向我解释这里发生的事情......
代码已经完成,您可以在SQL Server 2008上运行它,也可能在2005年运行它.一部分被注释掉了,我的想法是你可以通过注释掉一个或另一个来切换这两个案例.你可以看到你的块评论的位置,我用--block comment here和标记了这些地方--end block comment here
这是表现缓慢的情况,是未注释的默认情况.这个给你:
--Declare tables to use in example.
CREATE TABLE #Preparation
(
Date DATETIME NOT NULL
,Hour INT NOT NULL
,Sales NUMERIC(9,2)
,Items INT
);
CREATE TABLE #Calendar
(
Date DATETIME NOT NULL
)
CREATE TABLE #OpenHours
(
Day INT NOT NULL,
OpenFrom TIME NOT NULL,
OpenTo TIME NOT NULL
);
--Fill tables with sample data.
INSERT INTO #OpenHours (Day, OpenFrom, OpenTo)
VALUES
(1, '10:00', '20:00'),
(2, …Run Code Online (Sandbox Code Playgroud) 首先,我是pl/pgsql的新手.需要它用于项目.
我坚持这个(简化)问题.
我的db模式有一个到m的关系(作者,书籍,author_books)
现在我想要一个pl/psgsql函数insert_book.(我知道所有作者肯定已经在作者表中,所以我只想传递他们的主键).
这个功能大纲是我的想法.
create or replace function insert_book(book_to_insert book, authors integer[])
returns void as $$
begin
-- insert book into table books
-- for each author add an entry to author_books table
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
作为论据我想通过类型书的记录和编写它的作者.但这究竟是如何工作的呢?我用Google搜索了一下,似乎无法弄清楚这一点......
问题1:功能大纲是否"正确"/是否有意义?
问题2:如何将记录簿插入表格书?我是否必须遍历书籍的所有领域(title,isbn,publisher,...)并将它们添加到INSERT INTO语句中,还是有"更智能"的方式?
问题3:如何调用我的函数insert_book?我在这里找到了这个例子(http://dbaspot.com/postgresql/206142-passing-record-function-argument-pl-pgsql.html),但这对我没有帮助.出于测试目的,我使用shell,但稍后我们将使用Java和JDBC.
非常感谢您的帮助.
sql ×6
postgresql ×4
sql-server ×4
t-sql ×3
dblink ×1
graph ×1
insert ×1
performance ×1
plpgsql ×1
recursion ×1
sql-insert ×1
temp-tables ×1
types ×1
union ×1