Laploy Web Board
Would you like to react to this message? Create an account in a few clicks or log in to continue.

หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql

2 posters

Go down

หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql Empty หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql

ตั้งหัวข้อ  ray_ronnaret 6th June 2010, 11:27 pm

ขอคำอธิบายรายละเอียดาของการทำงาน ๆ 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 กับส่วนอื่น ๆ เลย แล้วผลการทำงาน ถูกต้องได้อย่างไร (ผมเข้าใจว่ามันทำงานถูก โดยดูจากที่นับออกมาได้ตามภาพประกอบในหนังสือ

รบกวนช่วยอธิบายรายละเอียดนิดครับ

ray_ronnaret

จำนวนข้อความ : 3
Join date : 06/06/2010

ขึ้นไปข้างบน Go down

หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql Empty ดูคิวรีให้ดีๆ

ตั้งหัวข้อ  Admin 7th June 2010, 1:06 pm

จุดที่สงสัยคือ ตรงที่เน้น คือ การ join เอา StateProvince เข้ามาโดย join กับตัวเอง มีทีมาอย่างไร อ่านแล้วสงสัยครับ
*********** นี่คือตัวอย่างการเขียนคิวรีที่มีการทำงานแบบ self-join ในกรณีนี้ทำ self-join เพื่อจำกัดแถวผลลัพธ์ให้มีเฉพาะเมืองที่อยู่ใน US

เพราะ ดูเหมือน StateProvince จะไม่ถูก join กับส่วนอื่น ๆ เลย แล้วผลการทำงาน ถูกต้องได้อย่างไร
*********** ถ้าตรวจดูคิวรีให้ดีๆ คุณจะพบว่า StateProvince ถูกอ้างถึงหลายแห่งภายใต้ชื่อเล่น sp

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql Empty Re: หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql

ตั้งหัวข้อ  ray_ronnaret 7th June 2010, 1:21 pm

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
==========================================
ก็ยังไม่เข้าใจนะครับ
ประเด็นที่ต้องการทราบคือ แนวคิด คิดมาได้อย่างไร มีที่มาอย่างไรครับ
ช่วยอธิบาย ที่มาหน่อยครับ

ray_ronnaret

จำนวนข้อความ : 3
Join date : 06/06/2010

ขึ้นไปข้างบน Go down

หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql Empty เพราะคุณยังไม่ได้อ่าน

ตั้งหัวข้อ  Admin 7th June 2010, 4:47 pm

สาเหตุที่คุณไม่เข้าใจคิวรีนี้เป็นเพราะคุณยังไม่ได้อ่านบทที่ 15 ให้อ่านต่อไปก่อนโดยยังไม่ต้องกังวลเรื่องนี้ เมื่อจบบทที่ 15 แล้วค่อยกลับมาดูคิวรีนี้อีกครั้ง

คิวรีทุกคิวรีเกิดจากโจทย์ ปรกติแล้วโจทย์จะมาจากลูกค้า (หรือนายจ้างหรือหัวหน้างาน) แต่คิวรีนี้มีไว้สอนการประยุกต์ใช้คำสั่ง CASE WHEN ผมจึงกำหนดโจทย์ไว้ว่า

"จงแสดงจำนวนรวมของลูกค้าทั้งหมดที่อยู่ใน West Coast และ Elsewhere (ของประเทศสหรัฐอเมริกา) และให้เขียนโดยใช้คำสั่ง CASE WHEN ร่วมด้วย"
(เพราะนี่้คือคิวรีสาธิตวิธีใช้ คำสั่ง CASE WHEN) โดยสมมุตว่า West Coast คือทุกเมืองใน CA WA และ OR ถ้าไม่ใช้ให้ถือเป็น Elsewhere (อ่านรายละเอียดในหนังสือหน้า 291)


หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql Captur12


คำสั่ง WITH ในบรรทัดที่ 2 บอกให้รู้ว่านี่้คือนิพจน์ตารางร่วม หรือ Common Table Expres​sion(CTE) ดูรายละเอียดเรื่อง CTE ในหนังสือหน้า 488 ดูวากยสัมพันธ์และตัวอย่างของ CTE แล้วนำมาเทียบกับคิวรีนี้คุณจะเข้าใจมากขุึ้น

โค้ดบรรทัดที่ 4 ถึง 16 ทำหน้าที่ตรวจสอบว่าลูกค้ารายใดอยู่ใน West Coast รายใดเป็น Elsewhere ให้ลองรันเฉพาะโค้ดส่วนนี้ แล้วดูผลลัพธ์ จะช่วยให้คุณเข้าใจมากขึ้น

บรรทัดที่ 18-20 นำผลลัพธ์ของ CTE ที่เป็น DT มาหาแอกกริเกตของ Region (คือนับจำนวนว่าเป็น West Coast เท่าใดและเป็น Elsewhere เท่าใด) ได้ผลลัพธ์อย่างที่เห็นในภาพบน

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql Empty Re: หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql

ตั้งหัวข้อ  ray_ronnaret 7th June 2010, 10:36 pm

ขอบคุณมาก ๆ ครับ

ผมลอง แยกเอาคิวรี่ไปลองเขียนแล้ว เฉพาะตรงการ join ที่ผมงงนั่นละครับ
ให้ Designer แสดงภาพ ปรากฎว่า sp มี รีเลชั่น เชื่อมไปยัง a ทั้ง ๆ ที่ใน join ไม่ระบุ เลยงง ดังภาพ
หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql Jcsql8j
http://yfrog.com/jcsql8j

ผมเป็นอย่างนี้เสมอ ๆ คือ อ่านแล้วต้องเข้าใจ ถ้าคาใจก็จะกังวล จนสลัดไม่หลุด
หรือจะเป็นเพราะ มีการเซตรีเลชั่นเอาไว้แล้ว มันเลยเชื่อมกันไป อัตโนมัติ
ไว้จะไล่อ่านไปจนถึงบทที่ 15 ตามคำแนะนำครับ

ray_ronnaret

จำนวนข้อความ : 3
Join date : 06/06/2010

ขึ้นไปข้างบน Go down

หนังสือ DATABASE 2008 บทที่ 10 ตัวอย่างที่ SQLQuery8.sql Empty ทำหน้าที่จอย

ตั้งหัวข้อ  Admin 8th June 2010, 12:41 am

ถ้าคุณดูคิวรีให้ดีๆ จะเห็นว่าคำสั่งบรรทัดที่ 14 ทำหน้าที่จอย a กับ sp

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

ขึ้นไปข้างบน

- Similar topics

 
Permissions in this forum:
คุณไม่สามารถพิมพ์ตอบ