y****w 发帖数: 3747 | 1 "以前的CTE就是摆设,只有到11r2还是多少才完善起来"
俺没说以前没有CTE阿,好吧,没强调recursive,虽然一般说起cte俺suppose就是recursive的,不然和subquery除了写法没啥区别。
oracle community还是习惯于connect by,但是从其他数据库过来的会更喜欢recursive CTE。
server/db2 can be convert to oracle, but can not convert oracle to others,
hehe |
|
B*****g 发帖数: 34098 | 2 一个sub用10次,用起来还是很方便的。而且execution plan也比较好控制。
recursive的,不然和subquery除了写法没啥区别。
recursive CTE。 |
|
y****w 发帖数: 3747 | 3 re recursive. 我说起cte来一般就默认recursive。。。 刚才beijing在另一个帖子里说的同一个subquery在一个sql里面被引用多次,那也是个常见用法。
建view,很多developer/application不会有权限的。如果在很多地方用到,那是个好的view candidate. 如果只是在一个地方用多次,dba大概不会太高兴手下的schema又复杂了一点。 |
|
B*****g 发帖数: 34098 | 4 nod,建个type DBA都要jjww一回。而且view不行呀,每次sql要是略有不同得搞多少
view呀
里说的同一个subquery在一个sql里面被引用多次,那也是个常见用法。
的view candidate. 如果只是在一个地方用多次,dba大概不会太高兴手下的schema又
复杂了一点。 |
|
g***l 发帖数: 18555 | 5 CTE只是用来替代复杂的SUBQUERY,临时放在内存里,用完就扔掉,如果要反复用的话
,还是建个TEMP TABLE |
|
y****w 发帖数: 3747 | 6 作为subquery替代功能,我倾向于相信CTE会抑制optimizer的改写(xx to some JOIN,
etc.)逻辑,强制生成中间临时表。没验证过。
另外,CTE降低了复杂多重子查询的书写难度,更自然,因为可以更多thinking in
prodedure than in set. |
|
y****w 发帖数: 3747 | 7 如上面有兄弟说的,cte最重要的用途还是在recursive。如果只是一个扩展易用版的
subquery,就没太大必要了。这也是为什么说oracle以前的cte也就是应付差事,聊胜于无了。 多数情况下,temp table太重量级,不方便,好比拿c去拼java了。
btw,我相信即使在oracle中,recursive CTE也会取代connect by的地位; 新应用的话能少用就少用,connect by早晚deprecated。就好比rbo特色了太久,回头best practice还是大家都用的cbo。 |
|
n*w 发帖数: 3393 | 8 sql server 上的非递归cte应该和subquery更接近吧。如果不是等同。
和temp table应该完全不同。 |
|
S*******s 发帖数: 13043 | 9 if I have a table like this
CREATE TABLE myTable(
id integer,
category char(10),
value float
)
and want to get a cross table pivoting the category. a usual approach using
subquery and outter join is like following
SELECT myTable.id, t1.value as c1, t2.value as c2, t3.value as c3
FROM myTable
LEFT JOIN ( SELECT value FROM myTable WHERE category = 'category 1' ) c1 ON
myTable.id=c1.id
LEFT JOIN ( SELECT value FROM myTable WHERE category = 'category 2' ) c2 ON
myTable.id=c1.id
LEFT JOIN ( SELECT va... 阅读全帖 |
|
v*****r 发帖数: 1119 | 10 i mean subquery resultset > 1 |
|
T****U 发帖数: 3344 | 11 In addition to coalesce, I think you can also use
nvl for oracle,
isnull for sql server
also be careful if its possible that subquery can return more than one row,
in that case its better you use Any All or Max/Min keywords.
main |
|
c*******e 发帖数: 8624 | 12 你这个写法很奇怪,如果subquery return了多个数会这么样?
感觉是一个数tablea.cola在跟tabley里面所有符合条件的colx
比较
main |
|
g***l 发帖数: 18555 | 13 对,SUBQUERY很容易返回多个数值,很悬,就多写几个QUERY,放在VARIABLE里。通常
出错都是这种COMBINE的QUERY,本来想返回一个值的,出来多个或者一个也没有。有时候
想飞,结果不是摔在地上就是翅膀扑通折了。 |
|
i****a 发帖数: 36252 | 14 example has been super simplified. the sub query only returns 1 value, or no
value.
it's basically to check if a record exists, if yes, return value, if not,
use a default value.
but I've taken it out of subquery and made it its own logic block for
another reason. |
|
s**********o 发帖数: 14359 | 15 因为没有KEY可JOIN,所以只能是CROSS JOIN,FILTER是date_
DATADIFF (date_,datadate)是正的,而且是最小的 ,然后SUBQUERY再从符合RANGE
的DATADATE里选择最大的RATE |
|
s**********o 发帖数: 14359 | 16 关于数据库学习也说几句,啥时髦学什么,可能
是对的,如果是入门的找工作的,可以去赶赶时髦。
但还是要看到,商业数据其实没那么复杂,比如银行,
HEALTHCARE,制药,零售,房地产,法律,这些才
是来钱的产业,怎么管理怎么开发使用数据还是大
有做头的,非死不可毕竟是个不怎么赚钱的新产业,
不如传统的产业来钱,搞传统的数据还是灵活,不
至于一棵树上吊死。工作就是工作,找着找着工作
又变成了搞研究了,这个心态要不得,老惦记着能不
能跟我以前的专业结合结合发个PAPER,很容易把自己
的方向搞得越来越窄,真要是工作久了,积劳成疾地
写个文章发表发表啥的,那也是后事了,现在就是要
把基本的DATA MODEL,NORMAL FORM,BASIC SQL,
STORED PROCEDURE学扎实,有些东西看上去很容易,
但好多计算机专业10年8年经验的DBA写的STORED PROCEDURE
都惨不忍睹,很多NET JAVA PROGRAMMER写的也不行,
包括很多SENIOR的,勉强把数据存取对就算不错了,
基本没有什么STANDARD和PERFORMANCE可言。很多人喜欢
玩花,我怎... 阅读全帖 |
|
m*********e 发帖数: 533 | 17 SQL会到什么程度呢?
要会写T-SQL,stored procedures and views, 还有database designs?
还是说会DML,DDL, table joins, subquery之类的核心呢? |
|
P********R 发帖数: 1691 | 18 (a) 在MS SQL Server里用这个JOIN的话,得出的结果应该会有重复(duplicate)的情
况,用IN(subquery)可以排除重复。
SELECT e1.id,
e1.sal
FROM employee AS e1
WHERE e1.sal IN
(SELECT e2.sal
FROM employee AS e2
WHERE e2.id <> e1.id)
ORDER BY e1.sal, e1.id;
(b) 用TOP 1, 倒着排序:
SELECT TOP1 WITH TIES
id,
sal
FROM employee
ORDER BY sal DESC, id; |
|
h****a 发帖数: 70 | 19 如果有两个表 T1(C1), T2(C2)
下面这个query有问题吗?
SELECT C1
FROM T1
WHERE C1 IN
(SELECT C1 FROM C2) |
|
z**********8 发帖数: 2049 | 20 我觉得是,INNER QUERY里的RESULT满足了某个条件,才到OUTER QUERY里去找相应DATA
.比如,只有满足销售额达到10000,才去找出这个CLIENT的电话啊,电邮啊等等。不满
足条件的,INNER QUERRY的时候,就跳过去了,不会去OUTER QUERY找相应的data. |
|
s**********o 发帖数: 14359 | 21 SELECT C1
FROM T1
WHERE C1 NOT IN
(SELECT C2 FROM T2) |
|
t****n 发帖数: 10724 | 22 Don't use semi-colon at the end of your sql.
you don't have to use subquery here. Tyr this
SELECT top N Partid, Description, Price FROM INVENTORY
ORDER BY Price |
|
l*******c 发帖数: 478 | 23 我是生物MASTER,左顾右盼了好久,最近终于确定想往DATA ANALYST方向转,就是只需
要应用SQL等相关软件做分析的那种,不是你们大牛们常说的那种DBA哦。请问3个问题:
1。再确定一下,有DATA ANALYST这个职业吧?只做分析,不做DEVELOPER的?
2。做DATA ANALYSIS需要编程吗?
3。我没有计算机基础(注意,真的是一点基础也没有,除了一些EXCEL应用),想先到
社区大学修些课,再去上SQL SERVER的培训班。请大家看看,哪些课有必要上。(这些
课都在一个叫“PROGRAMMING”的大专专业里。)我把课程名称和介绍贴在这里,谢谢
大家拉!
1)INT COLLEGE COMPUTING
The objective of this course is for students to gain the computer skills
needed to succeed in their academic careers and in today's workplace.
Majortopics include word processing, s... 阅读全帖 |
|
y****9 发帖数: 144 | 24 Your (1) and (2) seems not equivalent bcoz in your (1) you will have b's
fields If you mean the following:
(1) select a.* from a, b where a.id = b.id
(2) select a.* FROM a WHERE a.id IN (SELECT b.id FROM b)
I would think (2) could be more effcient, it is a semi-join; considering if
b.id is not unique, in (1) you will have duplicates. So my (1) and (2)
could not equivalent even in terms of result.
I don't think there are any problems to use subquery in terms of IN, NOT IN,
EXISTS, NOT EXISTS. O... 阅读全帖 |
|
y*****g 发帖数: 677 | 25 In MySQL,
usually inner join is better than IN(subquery).
if it is a finite number of list, although it can be a very long list, such
as in (1,2,3,...........,10000), it can still perform at least as well as
other alternatives. |
|
l******y 发帖数: 60 | 26 多谢coolbid大拿。我怎么糊涂到不用join呢?难怪被DBA鄙视。我原来用的数据库也就
几万条,最多10万条,这次很震撼。
AAA中的id不是PK(它是另一个表的PK,这个表的FK),返回近2000条记录。BBB的索引
建在另一个我不涉及的字段上。
join 的效率是不是要比subquery和exists高?如何判断?多谢指点! |
|
w****w 发帖数: 521 | 27 这是一个实际问题。10多年前,老板的老婆在养老院做人事,需要计算护士的工龄,那
里的流动性很大,有几十个养老院,加上有人做做停停,所以多的人可以有几十行。那
里的人搞不定就叫我帮忙,我就用cursor写了一个。写好后觉得这问题挺有意思,就又
花了点时间写了个纯sql的,只用subquery。当时是sql server 7,还没有window
functions。有兴趣的可以继续做,我找到旧的code后就贴上来。当然,包子多的话,
我会找得快些。 |
|
k***n 发帖数: 997 | 28 Thanks a lot.
当时我忘了subquery怎么写,网上google了一下找到了ms sql和mysql的不同版本,时
间紧没办法仔细看,也就没用。 |
|
r*******n 发帖数: 3020 | 29 主要用到join, union 和 group by, 数据来自不同的表,各种subquery用到比较多。
SQL 语言其实挺有意思的,应用数学里集合,很functional programming style。
不知道搞数据库的日常工作主要做什么,写script? |
|
s**********o 发帖数: 14359 | 30 带subquery还要GROUP BY,这个PERFORMANCE好不了多少吧,
你要能用三种不同的方法重写你的QUERY,水平就可以了 |
|
r*******n 发帖数: 3020 | 31 求指点。
我知道subquery 两种一种用 from table1, table2 where table1.id = table2.id;
第二种用 join;
第二种 performance比第一种要好。
还有用过with name as (select * from ...) 不知道算不算第三种 |
|
r*******n 发帖数: 3020 | 32 我是把概念join不同表和subquery搞错了;
TEMP TABLE 是我第一次听说,刚才google 了下,很有用。
多谢 |
|
a******t 发帖数: 125 | 33 新手来凑个热闹, 恳请大师们批判
T-SQL写的, 用subquery
SELECT s1.departmentid, s1.employeeid,s1.salary
FROM salary AS s1
WHERE s1.salary IN
(SELECT TOP (3) s2.salary
FROM salary AS s2
WHERE s1.departmentid= s2.departmentid); |
|
a******t 发帖数: 125 | 34 subquery和JOIN应该是可以互相换的,我一时还没想起来。
先请问为啥不用IN呢? |
|
g*********n 发帖数: 43 | 35 Good point. The subquery
select age,hobby_id, count(*) ct
from Users
group by 1,2;
can compress table Users into a, then we join "a" and "hobbies".
This indeed helps. But the thing is, even after the compression, table a
still has 25k rows:), and the join is still 25k * 200 = 5 million rows. |
|
d*******n 发帖数: 109 | 36 后来自己解决了这个问题,用的是笨办法,一步一步做出来了,但是肯定有好方法,用
subquery之类的,只是自己笨,想不出来而已。 |
|
d*******n 发帖数: 109 | 37 是的,谢谢。
顺便问一句,像这样的问题,是不是总是可以用subquery或者是table join加以解决?
如果是table join的话,为了确保不遗漏任何数据,必须在所以的table之间都用left
join ? 比如有10个table, 那必须用九个left join ? 谢谢。 |
|
s**********o 发帖数: 14359 | 38 你这个还弄个SUBQUERY,太麻烦了, ROW_NUMBER PARTITION BY啦 |
|
|
N**N 发帖数: 1713 | 40 那用(select distinct eid from table2)之类的subquery代替table2就行 |
|
d***e 发帖数: 793 | 41 update下:top n,或limit n这些都不是sql-92 compliant
不用这些,就要用ranking的方法,subquery或者join 然后group。以前Facebook的题
目讨论过类似的。 |
|
B*****g 发帖数: 34098 | 42 【 以下文字转载自 JobHunting 讨论区 】
发信人: Roseleaf929 (RL), 信区: JobHunting
标 题: 五月份免费SQL培训时间
发信站: BBS 未名空间站 (Mon May 5 00:43:46 2014, 美东)
大家好!为了方便一些学生朋友,特别安排在五月中旬考完考试之后:
Time: May 13(Tue) 6:00pm-8:00pm Session1
May 15(Thur) 6:00pm-8:00pm Session2
Session 1 (SQL 基础,DML&DDL,Database tables, 各种joins)
Session 2(Analysis Syntax, Null value 的处理,create table & Temporary Table
, Common Table Expression, Subquery, View, Stored Procedure)
需要做的准备:
①安装SQL SERVER:
http://www.mitbbs.com/clubarticle_t/DBA_BI_Clu... 阅读全帖 |
|
l******9 发帖数: 579 | 43 I need to add a column with an int value to the result from a subquery on
SQL.
It is Netezza SQL.
SELECT *
FROM
(
SELECT *
FROM table1
JOIN
table2
ON table1.id1 = table2.id1
GROUP BY table1.id2, table2.id3
) AS tt_a # here, I need to add a new column to tt, call it as top_id
and also assign an int value to it, such as 80
FROM
(
SELECT *
FROM table1
JOIN
table3
ON table1.id1 = table3.... 阅读全帖 |
|
c*****d 发帖数: 6045 | 44 如果要得到每个department有多少employee
select d.department_name, count(*)
from employees e, departments d
where e.department_id = d.department_id
group by d.department_name;
如果要得到employee name, location name和每个department有多少employee
必须要用partition或者subquery |
|
d******i 发帖数: 7160 | 45 简单说table(SC) 就两列:科目(cid)和分数(score)
因为MySql不让top 3,只得LIMIT 3.
SELECT score FROM SC SC0
WHERE score IN (
SELECT score FROM SC
WHERE cid=SC0.cid
ORDER BY score DESC
LIMIT 3
) T2
;
结果报错:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/
ALL/ANY/SOME subquery'
咋办呢?
请指教。谢了! |
|
|
s****e 发帖数: 54 | 47 if me,
I will define a variable to hold the vaule from first query, then set it to
the 2nd query.
create a sp
then exe the sp |
|
e****7 发帖数: 4387 | 48 或许我没理解对,大概可以写成这样:
Select Client
, Site
, Month
, Total_UU = SUM(UU)
, Per = (100.0 * SUM(Visit_Count*UU) / SUM(Visit_Count))
FROM ***
WHERE Client = **
AND Site = **
AND Month = **
GROUP BY Client, Site, Month
如果这个是web analytics 实际数据的话,我不是太理解。我做过好一阵子的web
analytics |
|
s****e 发帖数: 54 | 49 define @Sum integer
set @Sum=(select sum(uu) from tbl where client = ** and visit_count > 0
and month = ** and site = ** )
select visit_count - 1 as visit_count, uu, (1.0 * uu/ (1.0 * @SUM)) * 100 as
per from tbl where client = ** and visit_count > 1 and month = ** and site
= ** |
|
o******n 发帖数: 511 | 50 不好意思,我帖子没写清楚,这个是实际的数据,我就把那些数值变成整数而已。
我刚发现我昨天写的是对的,但我把意思理解错了,要算的不是访问一次的用户的百分
比而是两次的,怪不得我说数字怎么老对不上。
这是我自己现在改写好的。
这里和别人join
(select t1.client, t1.month, avg(t1.p) as percent_users_returning_once
from (select tbl.client, tbl.site, tbl.month,
case
when sum(tbl.uu)=0
then null
when sum(tbl.uu) is null
then null
else cast(sum(case when tbl.visit_count=2 then tbl.uu when tbl.
visit_count=1 then 0 when tbl.visit_count>2 then 0 end) a... 阅读全帖 |
|