我有一个在 mysql 数据库中创建 VIEW 的代码,该代码在我的本地服务器上运行良好。它可以正常创建和裁剪视图。但在我的在线服务器上它给出了错误
"CREATE VIEW command denied to user"
Run Code Online (Sandbox Code Playgroud)
对于在线数据库,我在数据库表单 PHPmyAdmin [Myadmin 位于本地主机在线] 中手动创建 VIEW,因此我有权在在线数据库上创建 VIEW。
但是用phpmysql_query就报错了command denied。是否有任何服务可以使用 php.ini 创建视图?
我有一个sql视图,我用它来检索数据.让我们说一大堆产品,这些产品与购买它们的顾客有关.无论链接到多少客户,每个产品的视图应仅返回一行.我正在使用row_number函数来实现这一点.(此示例已简化,通用情况将是一个查询,其中应该只为某列X的每个唯一值返回一行.返回哪一行并不重要)
CREATE VIEW productView AS
SELECT * FROM
(SELECT
Row_number() OVER(PARTITION BY products.Id ORDER BY products.Id) AS product_numbering,
customer.Id
//various other columns
FROM products
LEFT OUTER JOIN customer ON customer.productId = prodcut.Id
//various other joins
) as temp
WHERE temp.prodcut_numbering = 1
Run Code Online (Sandbox Code Playgroud)
现在假设此视图中的总行数约为100万,而从productView运行select*需要10秒.从productView执行查询,例如select*,其中productID = 10需要相同的时间.我相信这是因为查询得到了评估
SELECT * FROM
(SELECT
Row_number() OVER(PARTITION BY products.Id ORDER BY products.Id) AS product_numbering,
customer.Id
//various other columns
FROM products
LEFT OUTER JOIN customer ON customer.productId = prodcut.Id
//various other joins
) as temp
WHERE prodcut_numbering …Run Code Online (Sandbox Code Playgroud) 我想用Doctrine2映射一个sql-view 。
此视图是一个TempTable,其中包含一些统计信息,这些统计信息无需重写生成视图的sql即可显示
我尝试像表一样映射,但是更新架构会删除视图并创建表
我也尝试使用NativeSQL ...
public function getMessages(\Project\Bundle\MyBundle\Entity\User $user) {
$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$rsm->addEntityResult('MessageCenter', 'v');
$rsm->addFieldResult('v', 'user_id', 'user_id');
$rsm->addFieldResult('v', 'tot', 'tot');
$rsm->addFieldResult('v', 'read', 'read');
$rsm->addFieldResult('v', 'to_read', 'to_read');
$rsm->addFieldResult('v', 'stored', 'stored');
$rsm->addFieldResult('v', 'spam', 'spam');
$q = "SELECT * FROM message_stats_view WHERE user_id = ?";
$rsm = new \Doctrine\ORM\Query\ResultSetMapping;
$query = $this->getEntityManager()->createNativeQuery($q, $rsm);
$query->setParameter(1, $user->getId());
echo $query->getSQL();
var_dump($query->execute());
exit;
}
Run Code Online (Sandbox Code Playgroud)
我使用getter和setter创建了实体MessageCenter,但是我的输出是:
SELECT * FROM message_stats_view WHERE user_id = ?
array
empty
Run Code Online (Sandbox Code Playgroud) 我想在 PostgreSQL 中为我的视图创建一个触发器。这个想法是所有新数据都必须满足插入条件。但这里出了点问题,我在手册中找不到答案。
CREATE OR REPLACE VIEW My_View AS
SELECT name, adress, count FROM club, band, country;
CREATE OR REPLACE FUNCTION insert() RETURNS TRIGGER AS $$
BEGIN
IF(NEW.count > 10) THEN
INSERT INTO My_View VALUES (NEW.name, NEW.adress, NEW.count);
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER insert INSTEAD OF INSERT ON My_View
FOR EACH ROW EXECUTE PROCEDURE insert();
Run Code Online (Sandbox Code Playgroud) 假设我想编写一个SELECT使用以下内容的简单查询VIEW:
CREATE TEMP VIEW people AS
SELECT
p.person_id
,p.full_name
,p.phone
FROM person p
ORDER BY p.last_name;
SELECT
p.*
,h.address
,h.appraisal
FROM people p
LEFT JOIN homes h
ON h.person_id = p.person_id
ORDER BY p.last_name, h.appraisal;
Run Code Online (Sandbox Code Playgroud)
这里显而易见的问题是,p.last_name当我去执行决赛时,它已不再可用ORDER BY.
如何对最终查询进行排序,以便people视图的原始序列跟进到最终查询?
这里的简单解决方案是将p.last_name包含在视图中.我不想这样做 - 我的真实世界的例子(更复杂)使这成为一个问题.
我过去和临时表做过类似的事情.例如,我创建表,CREATE TEMP TABLE testing WITH OIDS然后执行一个ORDER BY testing.oid以传递原始序列.
是否有可能对视图做同样的事情?
我最近才意识到您现在可以在SQL Server中索引视图(请参阅http://technet.microsoft.com/en-us/library/cc917715.aspx).我现在正试图弄清楚当我从一个索引视图的查询中获得更好的性能与存储过程中的同一查询时,它的执行路径被缓存了吗?
举个例子如下:
SELECT colA, colB, sum(colC), sum(colD), colE
FROM myTable
WHERE colFDate < '9/30/2011'
GROUP BY colA, colB, colE
Run Code Online (Sandbox Code Playgroud)
每次运行时日期都会不同,所以如果这是一个视图,我不会WHERE在视图中包含它,而是将其作为我对视图的选择的一部分.如果它是存储过程,则日期将是参数.请注意,表中大约有300,000行.其中200,000个符合where条款和日期.在小组之后将返回10,000.
如果这是一个索引视图,我是否应该期望获得更好的性能而不是有机会缓存执行路径的存储过程?或者proc会更快吗?或者差异可以忽略不计?我知道我们可以说"只是尝试两种方式",但有太多因素可能会错误地偏向结果导致我得出错误的结论,所以我想听到更多关于它背后的理论以及预期的结果是什么.
谢谢!
我有一个观点女巫是这样工作的:
CREATE VIEW v_myView as SELECT * FROM(
(SELECT a,b,c,d FROM table1)
UNION ALL
(SELECT a,b,c,d FROM table2)
UNION ALL
(SELECT a,b,c,d FROM table3)
.
.
.)
Run Code Online (Sandbox Code Playgroud)
当我使用视图时,我像这样过滤它:
SELECT * FROM v_myView WHERE a=x
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但需要一个小时(一个真正的小时,不是形象地说)。如果我会做这样的查询:
SELECT * FROM(
(SELECT a,b,c,d FROM table1 WHERE a=x)
UNION ALL
(SELECT a,b,c,d FROM table2 WHERE a=x)
UNION ALL
(SELECT a,b,c,d FROM table3 WHERE a=x)
.
.
.)
Run Code Online (Sandbox Code Playgroud)
这需要一分钟。这让我想知道是否有办法让 MySql 自动执行,这意味着该WHERE命令将在获取每个表之前工作
通常我像这样连接/查询
class MyTable(Base):
__tablename__ = 'mytable'
__table_args__ = {'schema': 'tables'}
id = Column(Integer, primary_key=True)
salutation = Column(VARCHAR(1))
def __init__(self, salutation):
self.salutation = salutation
def load():
""""""
Session = sessionmaker(bind=engine)
session = Session()
for i in session.query(MyTable).order_by(MyTable.id):
entries.append(i.__dict__)
session.close()
Run Code Online (Sandbox Code Playgroud)
但是我如何在没有任何键的情况下查询(PostgreSQL)数据库视图?
我有一个使用多个连接的视图的 SQL 查询,该查询偶尔运行非常慢 - 比正常情况慢很多,使查询几乎无法使用。
我从视图中复制了查询并进行了试验并在https://dba.stackexchange.com/a/60180/52607找到了解决方案- 如果我添加
OPTION (MERGE JOIN, HASH JOIN)
Run Code Online (Sandbox Code Playgroud)
到查询结束时,它的运行速度提高了约 6 倍。
我现在尝试将 OPTION 调整为原始视图,但 SQL Server/SSMS 告诉我
Incorrect syntax near the keyword 'OPTION'.
Run Code Online (Sandbox Code Playgroud)
如何将此选项添加到视图中,以便视图的结果查询同样快?
(将选项添加到视图上的查询并没有导致任何加速。这看起来像这样:
select * from vMyView
where SomeDate >= CONVERT(Datetime, '2017.09.20')
OPTION (MERGE JOIN, HASH JOIN)
Run Code Online (Sandbox Code Playgroud)
我想我必须直接将此选项用于 vMyView - 如果可能的话。)
我有 2 个表都具有唯一约束,1 个连接这 2 个表的视图和一个INSTEAD OF INSERT允许INSERT或UPDATE在视图上的触发器。
一切正常INSERT,UPDATE但如果我这样做,INSERT .. ON CONFLICT(tableAColumn,tableBColumn) DO UPDATE我会收到错误消息:
[42P10] ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
Run Code Online (Sandbox Code Playgroud)
如果视图可以自动更新,那么我想我可以只使用 aWITH CHECK OPTION但是我如何使用INSTEAD OF INSERT触发器来做到这一点?
或者另一种方式来询问如何使视图具有与构建它的表相同的约束?
sql-view ×10
sql ×6
postgresql ×3
sql-server ×3
mysql ×2
triggers ×2
doctrine-orm ×1
mapping ×1
nativequery ×1
plpgsql ×1
query-hints ×1
sql-insert ×1
sql-order-by ×1
sql-update ×1
sqlalchemy ×1
t-sql ×1
temp-tables ×1
union ×1