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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql子查詢SQL
- MYSQL學習筆記26: 多表查詢|子查詢MySql筆記
- 子查詢學習筆記1筆記
- ORACLE_OCP之SQL_子查詢OracleSQL
- SQL查詢的:子查詢和多表查詢SQL
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- SQL--子查詢SQL
- SQL入門之4 group by 與子查詢SQL
- OCP課程8:SQL之使用子查詢SQL
- Sql Server系列:子查詢SQLServer
- sql語法相關子查詢與非相關子查詢SQL
- 【SQL查詢】集合查詢之INTERSECTSQL
- sql遞迴查詢子級SQL遞迴
- Django筆記二十一之使用原生SQL查詢資料庫Django筆記SQL資料庫
- es 筆記二之基礎查詢筆記
- MySQL之連線查詢和子查詢MySql
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- 子查詢-表子查詢
- sql-server不相關子查詢SQLServer
- sql-server相關子查詢SQLServer
- SQL語言基礎(子查詢)SQL
- OCP課程19:SQL之使用子查詢檢索資料SQL
- Spring Data Jpa 的簡單查詢多表查詢HQL,SQL ,動態查詢, QueryDsl ,自定義查詢筆記SpringSQL筆記
- sql之20再看查詢SQL
- 什麼是SQL 語句中相關子查詢與非相關子查詢SQL
- SQL -- 使用聯結還是子查詢?SQL
- 資料庫學習筆記之查詢表資料庫筆記
- 記錄 sql 查詢日誌SQL
- SQL重複記錄查詢SQL
- 訂單綜合查詢之sqlSQL
- sql之20高階查詢SQL
- 複雜查詢—子查詢
- 《T-SQL查詢》讀書筆記Part 1.邏輯查詢處理知多少SQL筆記
- es筆記五之term-level的查詢操作筆記
- RMAN筆記之查詢rman備份資訊狀態筆記
- 關於SQLServer2005的學習筆記——子查詢SQLServer筆記
- 相關子查詢&非相關子查詢概念
- Django筆記九之model查詢filter、exclude、annotate、order_byDjango筆記Filter