有一个复杂的查询生成一个报告.该查询具有多个子查询,可为不同的产品生成3列表.每个子查询返回一行.然后所有返回的行需要联合起来.但有一个要求.如果子查询没有结果行,我们无论如何都需要将相应的产品包含在最终报告中,但是指定Trades_Count等于零.
我可以使用一组变量来实现这一点.以下代码将在MS SQL Server中完美地运行:
DECLARE @PRODUCT_NAME_1 nvarchar(100);
DECLARE @OFFER_VALID_DATE_1 datetime;
DECLARE @TRADES_COUNT_1 int;
DECLARE @PRODUCT_NAME_2 nvarchar(100);
DECLARE @OFFER_VALID_DATE_2 datetime;
DECLARE @TRADES_COUNT_2 int;
--Product 1
select @PRODUCT_NAME_1 = PRODUCT_NAME, @OFFER_VALID_DATE_1 = MAX(EXPIRY_DATE), @TRADES_COUNT_1 = COUNT(DEAL_NUMBER)
from (
--Data extractions with several joins goes here....
) as TempTable1
GROUP BY PRODUCT_NAME
--Product 2
select @PRODUCT_NAME_2 = PRODUCT_NAME, @OFFER_VALID_DATE_2 = MAX(EXPIRY_DATE), @TRADES_COUNT_2 = COUNT(DEAL_NUMBER)
from (
--Data extractions with several joins goes here....
) as TempTable2
GROUP BY PRODUCT_NAME
SELECT ISNULL(@PRODUCT_NAME_1,'Product 1') AS …Run Code Online (Sandbox Code Playgroud) 这个问题听起来令人困惑,但看看:
这样我们就可以获得第一列(col1):
select distinct maker
from product
Run Code Online (Sandbox Code Playgroud)
第二列(col2):
select distinct type,maker
from product
Run Code Online (Sandbox Code Playgroud)
所以现在我需要从col1和col2获得所有可能的组合.有什么建议吗?
不久,这个:
A f1
B f2
Run Code Online (Sandbox Code Playgroud)
应该成为这样的:
A f1
A f2
B f1
B f2
Run Code Online (Sandbox Code Playgroud)
PS此查询不会返回我需要的内容.
select distinct A.maker, B.type
from product as A
Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种无需使用内置函数即可实现SQL分析功能的方法。
SELECT *,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rownum,
DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS denserank,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rnk
FROM emp;
Run Code Online (Sandbox Code Playgroud) 我们知道,为了将字符串文字限定为Unicode,我们需要N在Transact-SQL中为它添加前缀.我的问题是,这是否是ANSI SQL的任何标准的一部分.其他数据库平台会理解这个吗?
更新:
我使用Mig#的实际实验表明,为了使用Unicode文字:
在使用 Oracle 数据库练习 DBMS 和 SQL 时,当我尝试在一个表上触发 2 个选择查询时,数据库总是等待第一个查询完成执行并显然将另一个查询保持在管道中。
考虑一个表 MY_TABLE 有 100 万条记录,其中一个列 'id' 保存记录的序列号。
现在我的疑问是:-
查询 #1 - select * from MY_TABLE where id<500001; --I am fetching first 500,000 records here
查询 #2 - select * from MY_TABLE where id>500000; --I am fetching next 500,000 records here
由于这些是选择查询,因此它们必须获取共享锁表上的读锁。那为什么会出现这种现象呢?请注意,由于我通过 where 子句应用的过滤器,这两个查询的示例空间或域在我所知的情况下是相互排斥的,这进一步加剧了我的困惑。
此外,我正在以这种形式将其可视化,必须有一些过程正在评估我的查询,然后与内存(即资源)握手以获取结果。因此,所有持有该锁的进程都应该可以访问共享锁模式下的任何资源。
其次,有没有办法覆盖这种行为或同时执行多个选择查询。
注意:- 我想对特定任务(即表的数据)进行分块并提高脚本的速度。
SQL 标准中是否存在 INTERSECT 运算符?如果存在,它是可选运算符吗?
请留下一个可靠的来源。
在写了几年SQL之后,我发现经常把我感兴趣的列放入其中SELECT然后再次指定它们很烦人GROUP BY.我不禁想,我们为什么要那样做?
用户必须具体说明要分组的列的原因是什么?我们不能让SQL引擎假设是否存在聚合函数SELECT,其余的非聚合列分组?
当你有一个大的,这将是特别有帮助,更简洁CASE WHEN在SELECT.
这是一个非常普遍的问题,我希望找到一位既熟悉标准又熟悉一些数据库系统的专家。从高层次来看,SQL 标准中描述的类型系统与 Postgres、Oracle 或 DB2 中实现的类型系统之间有哪些差异。
我只是在编造一些东西(这是不正确的——只是用来显示我感兴趣的比较类型的格式),但一个例子可能是这样的:
| 标准 | Postgres | 甲骨文 |
|---|---|---|
INTERVAL类型 |
不存在,最接近的是TIME |
与标准相同。 |
(顺便说一句,这个问题对于 DBA 来说会更好吗?)
ansi-sql ×8
sql ×6
oracle ×3
sql-server ×2
acid ×1
ansi-sql-92 ×1
combinations ×1
intersect ×1
merge ×1
plsql ×1
postgresql ×1
t-sql ×1