SQL筆記之 子查詢080812
-- 摘自Jonathan Lewis的CBO基礎
-- 在解釋查詢變換時,舉的一個小例子,看完覺得有點意思,與大家分享
兩個數學家在在同學聚會上開始談論他們的家庭,作為數學家,他們的談話當然要含蓄點
甲:你有孩子麼?
乙:是的,有3個女兒
甲:她們多大了
乙:如果把她們的年齡相乘,結果為36
甲:不夠確切
乙:如果把她們的年齡相加,結果為這個房間的人數
甲:(環視整個房間後)仍不夠確切
乙:我的大女兒有一隻寵物倉鼠,它有一條木頭腿
甲:(此時甲已經知道其三個女兒的年齡)那麼,這兩個兩歲大的是雙胞胎嗎?
如何使用SQL來推導3個女兒的年齡呢?
[@more@]SQL筆記之 子查詢080812
-- 摘自Jonathan Lewis的CBO基礎
-- 在解釋查詢變換時,舉的一個小例子,看完覺得有點意思,與大家分享
兩個數學家在在同學聚會上開始談論他們的家庭,作為數學家,他們的談話當然要含蓄點
甲:你有孩子麼?
乙:是的,有3個女兒
甲:她們多大了
乙:如果把她們的年齡相乘,結果為36
甲:不夠確切
乙:如果把她們的年齡相加,結果為這個房間的人數
甲:(環視整個房間後)仍不夠確切
乙:我的大女兒有一隻寵物倉鼠,它有一條木頭腿
甲:(此時甲已經知道其三個女兒的年齡)那麼,這兩個兩歲大的是雙胞胎嗎?
如何使用SQL來推導3個女兒的年齡呢?
首先列出所有可能的年齡:1-36個整數,構造一個表
with age_list as (
select rownum age
from all_objects
where rownum <= 36
),
1
2
...
36
其次根據乘積36列出可能的組合
product_check as (
select
age1.age as youngest,
age2.age as middle,
age3.age as oldest,
age1.age + age2.age + age3.age as summed,
age1.age * age2.age * age3.age as product
from
age_list age1,
age_list age2,
age_list age3
where
age2.age >= age1.age
and age3.age >= age2.age
and age1.age * age2.age * age3.age = (
select max(age) from age_list
)
),
如果你在SQL>下邊看邊演示,這時你大概看出端倪了
YOUNGEST MIDDLE OLDEST SUMMED PRODUCT
3 3 4 10 36
2 3 6 11 36
1 6 6 13 36
2 2 9 13 36
1 4 9 14 36
1 3 12 16 36
1 2 18 21 36
1 1 36 38 36
現在加上年齡之和等於房間內人數,而還不能確定
因此,在房間內人數應該在上述結果集中有重複行。
再加上大女兒的倉鼠,因此得出2 2 9 年齡組合。
完整的SQL如下:
with age_list as (
select rownum age
from all_objects
where rownum <= 36
),
product_check as (
select
age1.age as youngest,
age2.age as middle,
age3.age as oldest,
age1.age + age2.age + age3.age as summed,
age1.age * age2.age * age3.age as product
from
age_list age1,
age_list age2,
age_list age3
where
age2.age >= age1.age
and age3.age >= age2.age
and age1.age * age2.age * age3.age = (
select max(age) from age_list
)
),
summed_check as (
select
youngest, middle, oldest, summed, product
from
(
select
youngest, middle, oldest, summed, product,
count(*) over(partition by summed) ct
from product_check
)
where ct > 1
)
select
*
from summed_check
where
oldest > middle
;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271063/viewspace-1008854/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE_OCP之SQL_子查詢OracleSQL
- MYSQL學習筆記26: 多表查詢|子查詢MySql筆記
- SQL查詢的:子查詢和多表查詢SQL
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- Django筆記二十一之使用原生SQL查詢資料庫Django筆記SQL資料庫
- Spring Data Jpa 的簡單查詢多表查詢HQL,SQL ,動態查詢, QueryDsl ,自定義查詢筆記SpringSQL筆記
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- es 筆記二之基礎查詢筆記
- SQL語言基礎(子查詢)SQL
- sql-server不相關子查詢SQLServer
- sql-server相關子查詢SQLServer
- MySQL之連線查詢和子查詢MySql
- 什麼是SQL 語句中相關子查詢與非相關子查詢SQL
- 資料庫學習筆記之查詢表資料庫筆記
- 【學習】SQL基礎-007-子查詢SQL
- 十七、Mysql之SQL優化查詢MySql優化
- 【SQL】Oracle查詢轉換之 OR用法SQLOracle
- es筆記五之term-level的查詢操作筆記
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- 一文終結SQL 子查詢優化SQL優化
- 複雜查詢—子查詢
- Python連線es筆記二之查詢方式彙總Python筆記
- Django筆記九之model查詢filter、exclude、annotate、order_byDjango筆記Filter
- 原生SQL查詢SQL
- SQL--查詢SQL
- SQL 聚合查詢SQL
- MYsql 子查詢MySql
- MySQL子查詢MySql
- 子串查詢
- 【SQL】Oracle查詢轉換之謂詞推送SQLOracle
- NOT IN之後的子查詢不能包含NULL值Null
- MySQL必知必會 學習筆記 第十四章 使用子查詢MySql筆記
- Mysql常用sql語句(20)- 子查詢重點知識MySql
- 秒級查詢之開源分散式SQL查詢引擎Presto實操-上分散式SQLREST
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- EntityFramework Core筆記:查詢資料(3)Framework筆記
- leetCode資料查詢筆記(簡單)LeetCode筆記
- (MySQL學習筆記)分頁查詢MySql筆記
- Django筆記十五之in查詢及date日期相關過濾操作Django筆記