การเปรียบเทียบข้อมูล 2 ตารางครับ
กระทู้เก่าบอร์ด อ.Yeadram

 6,178   7
URL.หัวข้อ / URL
การเปรียบเทียบข้อมูล 2 ตารางครับ

เรียนอาจาร์ยทุกท่านครับ
ถ้าต้องการตรวจสอบข้อมูล 2 ตาราง ที่จะต้องมีข้อมูลเหมือนกัน
ว่าข้อมูลนั้นเหมือนกันทั้งหมดเลยมั้ย

เนื่องจากตอนนี้ผมเปลี่ยนโปรแกรมจากของเดิมที่เคยใช้มาใช้ Access แล้วต้องการทราบว่าข้อมูลที่ได้จะต้องเหมือนเดิมเป๊ะๆนะครับ จริงๆจะใช้วิธีสุ่มบางรายการมาตรวจแต่คิดว่า Access น่าจะมีวิธี compare ทั้งหมดครับ

ตอนนี้ตรวจข้อมูล summary Field ที่เป็นตัวเลข และจำนวน record ถูกต้องแล้วครับ เหลือในส่วน details

เดี๋ยวคืนนี้จะลองหาวิธีต่อครับ

ถ้าอาจาร์ยท่านไหนเคยมีเคสนี้รบกวนด้วยครับ

7 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R19402
ดูที่นี่ครับ

http://youtu.be/TkZdfptGxu8
2 @R19403
เมื่อกี้พิมยาว กด post แล้วไม่ขึ้น

ผมลองแล้วครับอาจาร์ย TTT ถ้าแบบที่อาจาร์ยแนะนำมันจะดูแค่ Field เดียวว่ามีรายการที่แตกต่างมั้ยครับ
แต่ที่ต้องการตอนนี้คือ Compare ทุก Field ใน Record นั้นๆครับ (ถ้ามีข้อมูลที่ไม่เหมือนกันแม้แต่ Field เดียวก็ให้แสดงมาครับ)

ที่ลองคือ
select 1 ,2 ,3 ,...
From A inner join B on A.ID = B.ID
where A.1 <> B.1 or A.2 <> B.2 or ...

แบบนี้จะได้แบบที่ต้องการ(แต่ยังมีประเด็นถ้า A หรือ B อันใดอันหนึ่งมีค่าแล้วอีก table เป็น null จะไม่แสดงรายการนี้มา

ผมไม่ทราบว่าถ้าต้องการผลลัพท์แบบนี้ปกติมีวิธี Query แบบไหนมั้ยครับ
เดี๋ยวผมจะลองหาข้อมูลเพิ่มเติมครับถ้าได้ผลยังไงจะมาตอบครับ
ขอบคุณครับ
3 @R19408
ทำความเข้าใจก่อนนะครับ คือเราต้องมีตารางที่เป็นต้นฉบับไว้เทียบกับอีกตาราง ดังนั้นคิดว่าควรใช้เป็น LEFT JOIN น่าจะถูกต้องกว่า เอาเป็นว่าผมยกตัวอย่างให้ดูครับ
สมมุติผมมีตารางชื่อ Table1 และ Table2 มีฟิลด์เหมือนกันทุกประการณ์ดังนี้:

Table1:
P_Id    LastName    FirstName
1        Hansen        Ola
2        Svendson     Tove
3        Pettersen      Kari
4        Nilsen           Johan
-------------------------------------------
Table2:
P_Id    LastName    FirstName
1        Hansen        Ola       
2        Svendsn      Tove      
3        Pettersen     Kar       
-------------------------------------------
คราวนี้ผมอยากเปรียบเทียบโดยเอาตาราง Table1 เป็นหลัก เทียบกับตาราง Table2 ว่ามีเรคคอร์ดไหนของตาราง Table2 ที่ไม่เหมือนกับ Table1 ผมจะเขียน SQL แบบนี้
---------------------------------------------------------------------------------
SELECT Table1.P_Id, Table1.LastName, Table1.FirstName
FROM Table1 LEFT JOIN Table2 ON Table1.[LastName] = Table2.[LastName]
AND Table1.[FirstName] = Table2.[FirstName]
WHERE (Table2.LastName) Is Null;
-----------------------------------------------------------------------------------
ผลลัพธ์:
P_Id    LastName    FirstName
2        Svendson     Tove
3        Pettersen      Kari
4        Nilsen           Johan
------------------------------------------------
- จะเห็นผลลัพธ์ว่าจะแสดงเรคคอร์ดในตาราง Table1 ที่ไม่ตรงกับในตาราง Table2 ออกมา
- หากต้องการให้แสดงข้อมูลของตาราง Table2 ที่ไม่เหมือนกันเพื่อเปรียบเทียบด้วย ก็สามารถเพิ่มซับคิวรี่ได้เช่นกัน
----------------------------------------------------------------------
SELECT Table1.P_Id, Table1.LastName, Table1.FirstName,
(SELECT s.LastName FROM Table2 AS s WHERE s.P_Id = Table1.P_Id) AS [LastName-Table2],
(SELECT s.FirstName FROM Table2 AS s WHERE s.P_ID = Table1.P_Id) AS [FirstName-Table2]
FROM Table1 LEFT JOIN Table2 ON (Table1.[FirstName] = Table2.[FirstName]) AND (Table1.[LastName] = Table2.[LastName])
WHERE (Table2.LastName) Is Null;
----------------------------------------------------------------------
ผลลัพธ์:
P_Id    LastName    FirstName   LastName-Table2 FirstName-Talbe2
2        Svendson     Tove           Svendsn                 Tove             
3        Pettersen      Kari            Pettersen               Kar              
4        Nilsen           Johan                                          
--------------------------------------------------------------------------

*แต่ทั้งนี้ หากตาราง Table2 มีเรคคอร์ดมากกว่า Table1 มันจะไม่แสดงขึ้นเพราะจะถือ Table1 เป็นหลัก ถ้าหากคุณต้องการตรวจสอบ recheck คุณก็อาจจะใช้คำสั่งเดิมแต่กลับตารางก็ได้ หรืออาจใช้การ UNION ตารางก็ได้ดังนี้:
------------------------------------------------------------
SELECT Table1.P_Id AS P_Id
FROM Table1 LEFT JOIN Table2 ON Table1.[LastName] = Table2.[LastName]
AND Table1.[FirstName] = Table2.[FirstName]
WHERE (Table2.LastName) Is Null;
UNION
SELECT Table2.P_Id AS P_Id
FROM Table2 LEFT JOIN Table1 ON Table2.[LastName] = Table1.[LastName]
AND Table2.[FirstName] = Table1.[FirstName]
WHERE (Table1.LastName) Is Null;
------------------------------------------------------------------
ผลลัพธ์ คือ คุณจะได้เลขที่ P_Id ที่เรคคอร์ดไม่ตรงกันกลับมาไม่ว่าตารางไหนจะมากกว่าตารางไหนก็ตาม

ลองปรับใช้ดูครับ
4 @R19418
ขอบคุณครับอาจารย์ TTT
ขอไปลองก่อนครับ

ถามนิดครับส่วนที่เป็น Where เอาเฉพาะ Field ไหนก็ได้ 1 Field ใช่มั้ยครับ (แค่ Left join ให้ครบทุก Field ที่ต้องการ Check)
5 @R19420
ที่ถามเมื่อกี้ผมเข้าใจว่าส่วนของ Where (Table2.LastName) Is Null เนื่องจากเราเลือก Left join ทำให้ถ้ามีรายการไหนที่ออกมาแล้วค่าของ Table2 เป็น null (เนื่องจากมีแค่ Table1) ให้แสดงรายการนั้นออกมา

ผมเข้าใจถูกมั้ยครับ
6 @R19421
ถูกครับ เพราะเราใช้โอเปอร์เตอร์ AND คือไม่ว่าเงื่อนไขไหนเป็นเท็จแม้เพียงเงือนไขเดียวก็จะเป็นเท็จทังหมด ทำให้ในส่วนของ WHERE กรองแค่ฟิลด์เดียวก็พอครับ

ส่วนเรื่องของการ compare สองตารางนะครับ เท่าที่ผมเคยใช้และคิดว่าน่าจะสมบรูณ์สุด หากตารางมีการรัน ID ไว้ คือการทำทั้ง Left Join และ Right Join แล้วนำมา UNION กัน เพราะถ้าเราทำแต่ Left Join อย่างเดียว กรณีหากข้อมูลตาราง Table2 มี ID เลขที่ตาราง Table1 ไม่มี มันจะไม่แสดงขึ้นมา
ตัวอย่าง จากตาราง Table1 และ Table2 ด้านบน คุณลองเขียน SQL ประมาณนี้แล้วทำความเข้าใจและทดสองดูครับ

SQL:
SELECT Table1.P_Id,
Table1.LastName AS [LastName(Table1)],
Table1.FirstName AS [FirstName(Table1)],
(SELECT s.LastName FROM Table2 AS s WHERE s.P_Id = Table1.P_Id) AS [LastName(Table2)],
(SELECT s.FirstName FROM Table2 AS s WHERE s.P_Id = Table1.P_Id) AS [FirstName(Table2)]
FROM Table1 LEFT JOIN Table2 ON Table1.[LastName] = Table2.[LastName]
AND Table1.[FirstName] = Table2.[FirstName]
WHERE (Table2.LastName) Is Null;
UNION
SELECT Table2.P_Id,
(SELECT s.LastName FROM Table2 AS s WHERE s.P_Id = Table1.P_Id) AS [LastName(Table1)],
(SELECT s.FirstName FROM Table2 AS s WHERE s.P_Id = Table1.P_Id) AS [FirstName(Table1)],
Table2.LastName AS [Lastname(Table2)],
Table2.FirstName AS [FirstName(Table2)]
FROM Table2 LEFT JOIN Table1 ON Table2.P_Id = Table1.P_Id
WHERE (Table1.LastName) Is Null;

ผลลัพธ์:
P_Id    LastName(Table1)    FirstName(Table1)   LastName(Table2) FirstName(Table2)
2        Svendson                  Tove                          Svendsn                 Tove              
3        Pettersen                   Kari                           Pettersen                 Kar              
4                                                                             Nilsen                      Johan

ลักษณะนี้จะเป็นการเช็คของมูลไปกลับทั้งสองตาราง จะทำให้รู้ว่าข้อมูลไม่เหมือนกันตรงไหนของตารางอะไร เท่าที่ผมเคยใช้จะเป็นลักษณะนี้ครับ ปรับใช้ดู
7 @R19422
ได้แล้วครับ เนื่องจากข้อมูลที่มีหลายๆ field มีค่า null เข้ามาเลยต้องเพิ่มแก้ null เป็น 0 ก่อนครับไม่งั้น query นี้จะแสดงรายการที่มีข้อมูลเป็น null มาด้วย(แม้จะ null ทั้งสองตารางเหมือนกันครับ)

SELECT Table1.P_Id, Table1.LastName, Table1.FirstName
FROM Table1 LEFT JOIN Table2 ON NZ(Table1.[LastName],"0") = NZ(Table2.[LastName],"0")
AND NZ(Table1.[FirstName],"0") = NZ(Table2.[FirstName] ,"0")
WHERE (Table2.LastName) Is Null;

ขอบคุณอาจารย์ TTT มากๆ ครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2170s