好的,所以我有一个运行非常缓慢的报告存储过程。客户抱怨报告无法运行,所以我开始调查问题在存储过程中的确切位置,我发现这部分占用了 99.8% 的时间。
DECLARE @xmlTemp TABLE (
CompanyID INT,
StoreID INT,
StartDate DATETIME,
DateStaID INT,
EndDate DATETIME,
DateEndID INT,
LastUpdate DATETIME)
INSERT INTO @xmlTemp
VALUES (50,
2,
'3/3/2013',
0,
'3/3/2013',
0,
'3/3/2013')
SELECT DISTINCT T.CompanyID,
CompanyName,
Z.StoreID,
StoreName,
CashedOutBy,
TransactionID,
RegisterID,
BusinessDate,
CashedOut,
Total - Isnull((SELECT Sum(DISTINCT PaymentAmount)
FROM vPullDrawerPayments
WHERE CompanyID = T.CompanyID
AND StoreID = T.StoreID
AND TransactionID = T.TransactionID
AND Isnull(PaymentType, 1) <> 1), 0) AS PaymentAmount,
'Cash' AS PaymentDesc,
CASE
WHEN Z.EndDate >= Z.LastUpdate THEN 1 …Run Code Online (Sandbox Code Playgroud) 一些背景:
我有一个样本人口数据文件。数据文件中的每条记录都有一个频率权重(FIELD NAME: wgt),指示需要复制多少次记录才能获得真正的总体。数据在 Microsoft SQL 2008 R2 中设置。生成权重的频率分布以查看某种特定类型的记录是否以任何方式过度表示通常是一种很好的做法 - 从而帮助识别趋势/异常值。这个任务在 SQL 中很简单:
SELECT wgt, COUNT(*) FROM tablename
GROUP BY wgt
Run Code Online (Sandbox Code Playgroud)
挑战: 我想根据其他值进一步分离这些频率。假设不同家庭规模的权重频率分布。实现此目的的一种方法是在上述语句中使用不同的 where 条件:
SELECT wgt, COUNT(*) FROM tablename
WHERE household_size=x --x being the desired segment
GROUP BY wgt
Run Code Online (Sandbox Code Playgroud)
但是有没有办法用所有不同的段创建一个表?像这样的东西:
WGT | SIZE1 SIZE2 SIZE3 SIZE4
--------------------------------------------------
1 | 2,034 1,025 502 234
2 | 215 253 142 23
3 | 31 25 21 34
4 | 7 1 3 7
5 | 5 NULL 2 5
6 …Run Code Online (Sandbox Code Playgroud) 我很感激这个问题的方法,我在 mysql 中有一个彩票系统,这个系统每秒收到很多交易......很多!在允许下注之前,我需要检查每个数字的总金额,为此我有一个观点:
CREATE ALGORITHM=MERGE DEFINER=user@% SQL SECURITY DEFINER
VIEW view_todays_bet AS select number, sum(bet_amout) as total_bet from salestable;
Run Code Online (Sandbox Code Playgroud)
有了这个视图,我就有了这个结果,例如:
Number total_bet
===== ========
01 1500
05 2000
...
99 20
Run Code Online (Sandbox Code Playgroud)
所以当我有一个新的赌注时,我会从视图中进行选择,这就是问题出现的时候,例如,如果我想知道 05 号的余额,我会选择:
select total_bet from view_todays_bet where number = '05';
Run Code Online (Sandbox Code Playgroud)
如果我直接从主表进行选择,salestable我会被阻止,因为有很多来自其他投注的插入,但从视图中选择太慢。请给出一些关于这个问题的方法。
谢谢。
这是表的真实结构:标题/详细信息表和由两者连接而成的视图。
CREATE TABLE `sales_details` (
`codpais` varchar(2) NOT NULL DEFAULT '',
`numero` varchar(7) NOT NULL DEFAULT '',
`verificador` varchar(10) NOT NULL DEFAULT '',
`codterminal` varchar(8) NOT NULL DEFAULT '',
`item` int(4) NOT NULL DEFAULT …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 2008 中,我有视图WITH SCHEMABINDING,我需要更改一个视图。
我正在更改列而不更改其别名,因此消费者不会受到影响。
如果我要删除所有其他依赖于此的视图,我将能够再次重新创建它们,因此SCHEMABINDING仍然有效。
我可以暂时禁用此视图上的架构锁ALTER吗?
或者我必须删除依赖视图并在更改后重新创建它们?
Postgresql 文档在这一点上很清楚:您不能更改现有视图的列。
新查询必须生成与现有视图查询生成的列相同的列(即,列名相同,顺序和数据类型相同)(...)
参考:http : //www.postgresql.org/docs/9.3/static/sql-createview.html
为什么我必须删除视图或更改它来修改它?
我创建了一个视图和一个 INSTEAD OF 触发器,用于从该视图中插入/更新/删除。现在我尝试向视图中插入一些数据,PostgreSQL 返回以下错误(捷克语翻译:“chyba”=“error”,“Stav SQL”=“SQL state”):
ERROR: cannot insert into view "ukaz_lok"
DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable.
HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
********** Chyba **********
ERROR: cannot insert into view "ukaz_lok"
Stav SQL: 55000
Run Code Online (Sandbox Code Playgroud)
这发生在其他一些 INSTEAD OF 触发器之前 - 这个错误只持续了一段时间(几个小时?我不记得了)然后 PostgreSQL 找到了触发器。我尝试了各种事情(更改触发器,删除所有触发器和视图并重新创建它们等),但我不确定什么有效,只是有些东西有效。那么究竟如何让 PostgreSQL 识别触发器呢?
我在 Windows XP 32 位上有 PostgreSQL …
对于数据库部署,我在批处理文件中调用所有数据库架构更改并在目标数据库上运行它们。
有时我们有用于更改视图或存储过程的脚本。我想知道控制视图/sp 是否已成功更改并通过输出日志文件中的消息报告它的最佳方法是什么。
例如下面是我想要实现的伪代码:
IF
(
ALTER VIEW vw_abc
.
.
.
.
) Failed THEN
PRINT 'ALTER view vw_abc Failed'.
ELSE
PRINT 'ALTER view vw_abc Completed Successfully'
END
Run Code Online (Sandbox Code Playgroud)
输出消息将记录在由运行脚本的批处理文件生成的脚本日志文件中。
如果有任何我们可以检查的错误代码来做到这一点?任何的想法?
谢谢。
我有两张桌子,products并且subscriptions:
CREATE TABLE products (
id bigint NOT NULL,
title character varying(75),
description text,
manufacturer_id bigint,
created_at timestamp without time zone,
updated_at timestamp without time zone,
mpn text,
visible boolean DEFAULT false NOT NULL
);
CREATE TABLE subscriptions (
id bigint NOT NULL,
product_id bigint NOT NULL,
user_id bigint NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone
);
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我通常需要知道某个产品的订阅者数量,而在应用程序中所有正确位置使用此逻辑是很棘手的。所以我想products用已经包含该信息的视图替换该表。所以我这样做了:
ALTER TABLE ONLY products
RENAME TO products_raw;
CREATE VIEW products AS …Run Code Online (Sandbox Code Playgroud) 在 Postgresql 9.4 中,我们将视图作为表 A 和 B 的联合进行处理,并且当我们“删除”底层表中的记录时(通过 aa 触发器上的看法)。
这里有更详细的信息。我们的观点看起来像,
A
--
id, name
1, afoo
2, abar
B
--
id, name
3, bfoo
4, bbar
Run Code Online (Sandbox Code Playgroud)
所以我们的视图 C 看起来像
C
--
1, afoo
2, abar
3, bfoo
4, bbar
Run Code Online (Sandbox Code Playgroud)
我们做了一个CREATE TRIGGER delete_trigger INSTEAD OF DELETE C FOR EACH ROW DO delete_trigger(),它通过 id 删除行,这基本上就像
-- our function trigger():
$$
delete from A where id=old.id;
GET DIAGNOSTICS deletedA = ROW_COUNT;
delete from B where id=old.id;
GET DIAGNOSTICS deletedB = …Run Code Online (Sandbox Code Playgroud) 我正在为单独数据库中的视图创建多个代理视图。为了避免在两个地方定义视图,我想使用 SELECT * 创建代理视图。
我一直在寻找不这样做的原因,但没有找到。有人对使用 SELECT * 进行视图定义有意见吗?
view ×10
postgresql ×4
sql-server ×4
trigger ×2
join ×1
locking ×1
mysql ×1
performance ×1
plpgsql ×1
schema ×1
statistics ×1
update ×1