หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql
2 posters
หน้า 1 จาก 1
หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql
ขอคำอธิบายรายละเอียดาของการทำงาน ๆ query นี้หน่อยครับ
=======================================
USE AdventureWorks2008;
WITH CustomersByRegion(Region)AS
(
SELECT
CASE sp.StateProvinceCode
WHEN 'CA' THEN 'West Coast'
WHEN 'WA' THEN 'West Coast'
WHEN 'OR' THEN 'West Coast'
ELSE 'Elsewhere'
END
FROM Sales.Customer a
INNER JOIN Person.Address p
ON a.TerritoryID = p.AddressID
INNER JOIN Person.StateProvince sp
ON p.StateProvinceID = p.StateProvinceID
WHERE sp.CountryRegionCode = 'US'
)
SELECT COUNT(Region) AS NumOfCustomers, Region
FROM CustomersByRegion
GROUP BY Region;
GO
=========================================
จุดที่สงสัยคือ ตรงที่เน้น คือ การ join เอา StateProvince เข้ามาโดย join กับตัวเอง มีทีมาอย่างไร อ่านแล้วสงสัยครับ
เพราะ ดูเหมือน StateProvince จะไม่ถูก join กับส่วนอื่น ๆ เลย แล้วผลการทำงาน ถูกต้องได้อย่างไร (ผมเข้าใจว่ามันทำงานถูก โดยดูจากที่นับออกมาได้ตามภาพประกอบในหนังสือ
รบกวนช่วยอธิบายรายละเอียดนิดครับ
=======================================
USE AdventureWorks2008;
WITH CustomersByRegion(Region)AS
(
SELECT
CASE sp.StateProvinceCode
WHEN 'CA' THEN 'West Coast'
WHEN 'WA' THEN 'West Coast'
WHEN 'OR' THEN 'West Coast'
ELSE 'Elsewhere'
END
FROM Sales.Customer a
INNER JOIN Person.Address p
ON a.TerritoryID = p.AddressID
INNER JOIN Person.StateProvince sp
ON p.StateProvinceID = p.StateProvinceID
WHERE sp.CountryRegionCode = 'US'
)
SELECT COUNT(Region) AS NumOfCustomers, Region
FROM CustomersByRegion
GROUP BY Region;
GO
=========================================
จุดที่สงสัยคือ ตรงที่เน้น คือ การ join เอา StateProvince เข้ามาโดย join กับตัวเอง มีทีมาอย่างไร อ่านแล้วสงสัยครับ
เพราะ ดูเหมือน StateProvince จะไม่ถูก join กับส่วนอื่น ๆ เลย แล้วผลการทำงาน ถูกต้องได้อย่างไร (ผมเข้าใจว่ามันทำงานถูก โดยดูจากที่นับออกมาได้ตามภาพประกอบในหนังสือ
รบกวนช่วยอธิบายรายละเอียดนิดครับ
ray_ronnaret- จำนวนข้อความ : 3
Join date : 06/06/2010
ดูคิวรีให้ดีๆ
จุดที่สงสัยคือ ตรงที่เน้น คือ การ join เอา StateProvince เข้ามาโดย join กับตัวเอง มีทีมาอย่างไร อ่านแล้วสงสัยครับ
*********** นี่คือตัวอย่างการเขียนคิวรีที่มีการทำงานแบบ self-join ในกรณีนี้ทำ self-join เพื่อจำกัดแถวผลลัพธ์ให้มีเฉพาะเมืองที่อยู่ใน US
เพราะ ดูเหมือน StateProvince จะไม่ถูก join กับส่วนอื่น ๆ เลย แล้วผลการทำงาน ถูกต้องได้อย่างไร
*********** ถ้าตรวจดูคิวรีให้ดีๆ คุณจะพบว่า StateProvince ถูกอ้างถึงหลายแห่งภายใต้ชื่อเล่น sp
*********** นี่คือตัวอย่างการเขียนคิวรีที่มีการทำงานแบบ self-join ในกรณีนี้ทำ self-join เพื่อจำกัดแถวผลลัพธ์ให้มีเฉพาะเมืองที่อยู่ใน US
เพราะ ดูเหมือน StateProvince จะไม่ถูก join กับส่วนอื่น ๆ เลย แล้วผลการทำงาน ถูกต้องได้อย่างไร
*********** ถ้าตรวจดูคิวรีให้ดีๆ คุณจะพบว่า StateProvince ถูกอ้างถึงหลายแห่งภายใต้ชื่อเล่น sp
Re: หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql
USE AdventureWorks2008;
WITH CustomersByRegion(Region)AS
(
SELECT
CASE sp.StateProvinceCode
WHEN 'CA' THEN 'West Coast'
WHEN 'WA' THEN 'West Coast'
WHEN 'OR' THEN 'West Coast'
ELSE 'Elsewhere'
END
FROM Sales.Customer a
INNER JOIN Person.Address p
ON a.TerritoryID = p.AddressID
INNER JOIN Person.StateProvince sp
ON p.StateProvinceID = p.StateProvinceID
WHERE sp.CountryRegionCode = 'US')
SELECT COUNT(Region) AS NumOfCustomers, Region
FROM CustomersByRegion
GROUP BY Region;
GO
==========================================
ก็ยังไม่เข้าใจนะครับ
ประเด็นที่ต้องการทราบคือ แนวคิด คิดมาได้อย่างไร มีที่มาอย่างไรครับ
ช่วยอธิบาย ที่มาหน่อยครับ
WITH CustomersByRegion(Region)AS
(
SELECT
CASE sp.StateProvinceCode
WHEN 'CA' THEN 'West Coast'
WHEN 'WA' THEN 'West Coast'
WHEN 'OR' THEN 'West Coast'
ELSE 'Elsewhere'
END
FROM Sales.Customer a
INNER JOIN Person.Address p
ON a.TerritoryID = p.AddressID
INNER JOIN Person.StateProvince sp
ON p.StateProvinceID = p.StateProvinceID
WHERE sp.CountryRegionCode = 'US')
SELECT COUNT(Region) AS NumOfCustomers, Region
FROM CustomersByRegion
GROUP BY Region;
GO
==========================================
ก็ยังไม่เข้าใจนะครับ
ประเด็นที่ต้องการทราบคือ แนวคิด คิดมาได้อย่างไร มีที่มาอย่างไรครับ
ช่วยอธิบาย ที่มาหน่อยครับ
ray_ronnaret- จำนวนข้อความ : 3
Join date : 06/06/2010
เพราะคุณยังไม่ได้อ่าน
สาเหตุที่คุณไม่เข้าใจคิวรีนี้เป็นเพราะคุณยังไม่ได้อ่านบทที่ 15 ให้อ่านต่อไปก่อนโดยยังไม่ต้องกังวลเรื่องนี้ เมื่อจบบทที่ 15 แล้วค่อยกลับมาดูคิวรีนี้อีกครั้ง
คิวรีทุกคิวรีเกิดจากโจทย์ ปรกติแล้วโจทย์จะมาจากลูกค้า (หรือนายจ้างหรือหัวหน้างาน) แต่คิวรีนี้มีไว้สอนการประยุกต์ใช้คำสั่ง CASE WHEN ผมจึงกำหนดโจทย์ไว้ว่า
"จงแสดงจำนวนรวมของลูกค้าทั้งหมดที่อยู่ใน West Coast และ Elsewhere (ของประเทศสหรัฐอเมริกา) และให้เขียนโดยใช้คำสั่ง CASE WHEN ร่วมด้วย"
(เพราะนี่้คือคิวรีสาธิตวิธีใช้ คำสั่ง CASE WHEN) โดยสมมุตว่า West Coast คือทุกเมืองใน CA WA และ OR ถ้าไม่ใช้ให้ถือเป็น Elsewhere (อ่านรายละเอียดในหนังสือหน้า 291)
คำสั่ง WITH ในบรรทัดที่ 2 บอกให้รู้ว่านี่้คือนิพจน์ตารางร่วม หรือ Common Table Expression(CTE) ดูรายละเอียดเรื่อง CTE ในหนังสือหน้า 488 ดูวากยสัมพันธ์และตัวอย่างของ CTE แล้วนำมาเทียบกับคิวรีนี้คุณจะเข้าใจมากขุึ้น
โค้ดบรรทัดที่ 4 ถึง 16 ทำหน้าที่ตรวจสอบว่าลูกค้ารายใดอยู่ใน West Coast รายใดเป็น Elsewhere ให้ลองรันเฉพาะโค้ดส่วนนี้ แล้วดูผลลัพธ์ จะช่วยให้คุณเข้าใจมากขึ้น
บรรทัดที่ 18-20 นำผลลัพธ์ของ CTE ที่เป็น DT มาหาแอกกริเกตของ Region (คือนับจำนวนว่าเป็น West Coast เท่าใดและเป็น Elsewhere เท่าใด) ได้ผลลัพธ์อย่างที่เห็นในภาพบน
คิวรีทุกคิวรีเกิดจากโจทย์ ปรกติแล้วโจทย์จะมาจากลูกค้า (หรือนายจ้างหรือหัวหน้างาน) แต่คิวรีนี้มีไว้สอนการประยุกต์ใช้คำสั่ง CASE WHEN ผมจึงกำหนดโจทย์ไว้ว่า
"จงแสดงจำนวนรวมของลูกค้าทั้งหมดที่อยู่ใน West Coast และ Elsewhere (ของประเทศสหรัฐอเมริกา) และให้เขียนโดยใช้คำสั่ง CASE WHEN ร่วมด้วย"
(เพราะนี่้คือคิวรีสาธิตวิธีใช้ คำสั่ง CASE WHEN) โดยสมมุตว่า West Coast คือทุกเมืองใน CA WA และ OR ถ้าไม่ใช้ให้ถือเป็น Elsewhere (อ่านรายละเอียดในหนังสือหน้า 291)
คำสั่ง WITH ในบรรทัดที่ 2 บอกให้รู้ว่านี่้คือนิพจน์ตารางร่วม หรือ Common Table Expression(CTE) ดูรายละเอียดเรื่อง CTE ในหนังสือหน้า 488 ดูวากยสัมพันธ์และตัวอย่างของ CTE แล้วนำมาเทียบกับคิวรีนี้คุณจะเข้าใจมากขุึ้น
โค้ดบรรทัดที่ 4 ถึง 16 ทำหน้าที่ตรวจสอบว่าลูกค้ารายใดอยู่ใน West Coast รายใดเป็น Elsewhere ให้ลองรันเฉพาะโค้ดส่วนนี้ แล้วดูผลลัพธ์ จะช่วยให้คุณเข้าใจมากขึ้น
บรรทัดที่ 18-20 นำผลลัพธ์ของ CTE ที่เป็น DT มาหาแอกกริเกตของ Region (คือนับจำนวนว่าเป็น West Coast เท่าใดและเป็น Elsewhere เท่าใด) ได้ผลลัพธ์อย่างที่เห็นในภาพบน
Re: หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql
ขอบคุณมาก ๆ ครับ
ผมลอง แยกเอาคิวรี่ไปลองเขียนแล้ว เฉพาะตรงการ join ที่ผมงงนั่นละครับ
ให้ Designer แสดงภาพ ปรากฎว่า sp มี รีเลชั่น เชื่อมไปยัง a ทั้ง ๆ ที่ใน join ไม่ระบุ เลยงง ดังภาพ
http://yfrog.com/jcsql8j
ผมเป็นอย่างนี้เสมอ ๆ คือ อ่านแล้วต้องเข้าใจ ถ้าคาใจก็จะกังวล จนสลัดไม่หลุด
หรือจะเป็นเพราะ มีการเซตรีเลชั่นเอาไว้แล้ว มันเลยเชื่อมกันไป อัตโนมัติ
ไว้จะไล่อ่านไปจนถึงบทที่ 15 ตามคำแนะนำครับ
ผมลอง แยกเอาคิวรี่ไปลองเขียนแล้ว เฉพาะตรงการ join ที่ผมงงนั่นละครับ
ให้ Designer แสดงภาพ ปรากฎว่า sp มี รีเลชั่น เชื่อมไปยัง a ทั้ง ๆ ที่ใน join ไม่ระบุ เลยงง ดังภาพ
http://yfrog.com/jcsql8j
ผมเป็นอย่างนี้เสมอ ๆ คือ อ่านแล้วต้องเข้าใจ ถ้าคาใจก็จะกังวล จนสลัดไม่หลุด
หรือจะเป็นเพราะ มีการเซตรีเลชั่นเอาไว้แล้ว มันเลยเชื่อมกันไป อัตโนมัติ
ไว้จะไล่อ่านไปจนถึงบทที่ 15 ตามคำแนะนำครับ
ray_ronnaret- จำนวนข้อความ : 3
Join date : 06/06/2010
Similar topics
» เรียนรู้ด้วยตนเอง Database : บทที่ 23 รูปที่ 23.8
» หนังสือ เรียนรู้ด้วยตนเอง DataBase อ่านยากนะครับ
» จากหนังสือ เรียนรู้ด้วยตนเอง Database : ติดตั้งโปรแกรม MS SQL Server 2008 Express ตอนใช้งานใน Management ไม่มี Data Collection
» วิธีดาวน์โหลดไฟล์ประกอบหนังสือ Database
» ฐานข้อมูลตัวอย่าง
» หนังสือ เรียนรู้ด้วยตนเอง DataBase อ่านยากนะครับ
» จากหนังสือ เรียนรู้ด้วยตนเอง Database : ติดตั้งโปรแกรม MS SQL Server 2008 Express ตอนใช้งานใน Management ไม่มี Data Collection
» วิธีดาวน์โหลดไฟล์ประกอบหนังสือ Database
» ฐานข้อมูลตัวอย่าง
หน้า 1 จาก 1
Permissions in this forum:
คุณไม่สามารถพิมพ์ตอบ
|
|