• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Nhờ nối 4 bảng này thành 1 bảng SQL server

Chuyên mục thảo luận các vấn đề liên quan đến ứng dụng quản lý và cơ sở dữ liệu

Moderator: Điều hành

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 539
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 189 times
Been thanked: 33 times
Contact:

Nhờ nối 4 bảng này thành 1 bảng SQL server

Postby muaphonui_2010 » Fri 14/02/2020 10:26 pm

Chào các bạn.
Giả sử mình có 4 bảng như sau:
- @MeCha
+ T_con1
+ T_con2
+ T_con3
3 bảng T_con được nối với @MeCha qua cột ID
Dữ liệu giả sử như dưới đây:
  1. DECLARE @MeCha TABLE(id INT,cot1 VARCHAR(40) , cot2 VARCHAR(40))
  2. INSERT INTO @MeCha
  3. VALUES
  4. (1,'A1','A2')  ,
  5. (2,'B1','B2') ,
  6. (3,'C1','C2') ,
  7. (4,'D1','D2'),
  8. (5,'E1','E2'),
  9. (6,'F1','F2'),
  10. (7,'H1','H2')  
  11. SELECT * FROM @MeCha
  12.  
  13. DECLARE @T_Con1 TABLE(idchung INT, id INT,cot3 VARCHAR(40) , cot4 VARCHAR(40))
  14. INSERT INTO @T_Con1
  15. VALUES
  16. (1,1,'A3','A4')  ,
  17. (12,1,'B3','B4') ,
  18. (31,3,'C3','C4') ,
  19. (41,4,'D3','D4'),
  20. (42,5,'E3','E4'),
  21. (43,5,'F3','F4'),
  22. (44,5,'H3','H4')   
  23. SELECT * FROM @T_Con1
  24.  
  25.  
  26. DECLARE @T_Con2 TABLE(idchung INT, id INT,cot5 VARCHAR(40) , cot6 VARCHAR(40))
  27. INSERT INTO @T_Con2
  28. VALUES
  29. (11,1,'A5','A6'),
  30. (12,1,'B5','B6'),
  31. (13,4,'C5','C6'),
  32. (14,4,'D5','D6')   
  33. SELECT * FROM @T_Con2
  34.  
  35. DECLARE @T_Con3 TABLE(idchung INT, id INT,cot7 VARCHAR(40) , cot8 VARCHAR(40))
  36. INSERT INTO @T_Con3
  37. VALUES
  38. (11,5,'A7','A8'),
  39. (17,5,'B7','B8'),
  40. (18,6,'C7','C8'),
  41. (19,7,'D7','D8')   
  42. SELECT * FROM @T_Con3


Và mình muốn kết quả như hình này
Image
Mình nghĩ cái này chắc khó, mong các bạn hỗ trợ mình với nhé.
Xin cảm ơn



FlyingFox
Guru
Guru
Posts: 816
Joined: Wed 20/04/2011 9:56 am
Been thanked: 325 times

Re: Nhờ nối 4 bảng này thành 1 bảng SQL server

Postby FlyingFox » Wed 19/02/2020 9:54 am

Có thể viết như sau:
  1. DECLARE @MeCha TABLE(id INT,cot1 VARCHAR(40) , cot2 VARCHAR(40))
  2. INSERT INTO @MeCha
  3. VALUES
  4. (1,'A1','A2')  ,
  5. (2,'B1','B2') ,
  6. (3,'C1','C2') ,
  7. (4,'D1','D2'),
  8. (5,'E1','E2'),
  9. (6,'F1','F2'),
  10. (7,'H1','H2')  
  11.  
  12.  
  13. DECLARE @T_Con1 TABLE(idchung INT, id INT,cot3 VARCHAR(40) , cot4 VARCHAR(40))
  14. INSERT INTO @T_Con1
  15. VALUES
  16. (1,1,'A3','A4')  ,
  17. (12,1,'B3','B4') ,
  18. (31,3,'C3','C4') ,
  19. (41,4,'D3','D4'),
  20. (42,5,'E3','E4'),
  21. (43,5,'F3','F4'),
  22. (44,5,'H3','H4')  
  23.  
  24. DECLARE @T_Con2 TABLE(idchung INT, id INT,cot5 VARCHAR(40) , cot6 VARCHAR(40))
  25. INSERT INTO @T_Con2
  26. VALUES
  27. (11,1,'A5','A6'),
  28. (12,1,'B5','B6'),
  29. (13,4,'C5','C6'),
  30. (14,4,'D5','D6')  
  31.  
  32.  
  33. DECLARE @T_Con3 TABLE(idchung INT, id INT,cot7 VARCHAR(40) , cot8 VARCHAR(40))
  34. INSERT INTO @T_Con3
  35. VALUES
  36. (11,5,'A7','A8'),
  37. (17,5,'B7','B8'),
  38. (18,6,'C7','C8'),
  39. (19,7,'D7','D8')  
  40.  
  41. DECLARE @T TABLE(id INT, cot1 VARCHAR(40), cot2 VARCHAR(40), cot3 VARCHAR(40), cot4 VARCHAR(40), row_id INT)
  42. DECLARE @T_Result TABLE(id INT, cot1 VARCHAR(40) NULL, cot2 VARCHAR(40) NULL,
  43.                         cot3 VARCHAR(40) NULL, cot4 VARCHAR(40) NULL,
  44.                         cot5 VARCHAR(40) NULL, cot6 VARCHAR(40) NULL,
  45.                         cot7 VARCHAR(40) NULL, cot8 VARCHAR(40) NULL,
  46.                         row_id INT)
  47. INSERT INTO @T_Result
  48. SELECT a.id, a.cot1, a.cot2,
  49.        b.cot3, b.cot4,
  50.        NULL, NULL,
  51.        NULL, NULL,
  52.        ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY  a.id, b.idchung) AS row_id
  53. FROM @MeCha a
  54. LEFT JOIN @T_Con1 b ON a.id = b.id
  55.  
  56. INSERT INTO @T
  57. SELECT a.id, a.cot1, a.cot2, b.cot5, b.cot6,
  58.        ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY a.id, b.idchung) AS row_id
  59. FROM @MeCha a
  60. LEFT JOIN @T_Con2 b ON a.id = b.id
  61.  
  62. UPDATE @T_Result
  63.    SET cot5 = b.cot3, cot6 = b.cot4
  64.   FROM @T_Result a
  65.  INNER JOIN @T b ON a.id = b.id AND a.row_id = b.row_id
  66.  
  67. INSERT INTO @T_Result
  68. SELECT id, cot1, cot2,
  69.        NULL, NULL,
  70.        cot3, cot4,
  71.        NULL, NULL,
  72.        row_id
  73.    FROM @T b
  74. WHERE NOT EXISTS (SELECT 1 FROM @T_Result WHERE id = b.id AND row_id = b.row_id)
  75.  
  76. DELETE FROM @T
  77. INSERT INTO @T
  78. SELECT a.id, a.cot1, a.cot2, b.cot7, b.cot8,
  79.        ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY a.id, b.idchung) AS row_id
  80. FROM @MeCha a
  81. LEFT JOIN @T_Con3 b ON a.id = b.id
  82.  
  83. UPDATE @T_Result
  84.    SET cot7 = b.cot3, cot8 = b.cot4
  85.   FROM @T_Result a
  86.  INNER JOIN @T b ON a.id = b.id AND a.row_id = b.row_id
  87.  
  88. INSERT INTO @T_Result
  89. SELECT id, cot1, cot2,
  90.        NULL, NULL,
  91.        NULL, NULL,
  92.        cot3, cot4,
  93.        row_id
  94. FROM @T b
  95. WHERE NOT EXISTS (SELECT 1 FROM @T_Result WHERE id = b.id AND row_id = b.row_id)
  96.  
  97. SELECT * FROM @T_Result ORDER BY id
  98.  

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 539
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 189 times
Been thanked: 33 times
Contact:

Re: Nhờ nối 4 bảng này thành 1 bảng SQL server

Postby muaphonui_2010 » Wed 19/02/2020 7:27 pm

Cảm ơn anh.
Anh có thể giúp lại em phần này với.
Vì thực tế 3 bảng con của em không bằng số cột với nhau.
Nên khi em áp dụng của anh vào thì em bị bí ở đoạn này
  1. UPDATE @T_Result
  2.    SET cot5 = b.cot3, cot6 = b.cot4
  3.   FROM @T_Result a
  4.  INNER JOIN @T b ON a.id = b.id AND a.row_id = b.row_id

Nên em làm lại bảng dữ liệu nhờ anh giúp lại em với
(Với dữ liệu dưới thì: Bảng con 1 : có 7 cột, Bảng con 2: có 2 cột, Bảng con 3: có 5 cột : gồm ID)
Xin lỗi đã làm mất công anh.
[sql]
DECLARE @MeCha TABLE(id INT,cot1 VARCHAR(40) , cot2 VARCHAR(40))
INSERT INTO @MeCha
VALUES
(1,'A1','A2') ,
(2,'B1','B2') ,
(3,'C1','C2') ,
(4,'D1','D2'),
(5,'E1','E2'),
(6,'F1','F2'),
(7,'H1','H2')


DECLARE @T_Con1 TABLE(idchung INT, id INT, cot3 Datetime , cot4 Datetime, cot5 VARCHAR(40), cot6 INT, cot7 INT)
INSERT INTO @T_Con1
VALUES
(1,1,DATEADD(MINUTE,11,(getdate())),DATEADD(MINUTE,21,(getdate())), 'A5',52,2),
(12,1,DATEADD(MINUTE,12,(getdate())),DATEADD(MINUTE,21,(getdate())),'B5',61,6),
(31,3,DATEADD(MINUTE,13,(getdate())),DATEADD(MINUTE,21,(getdate())),'C5',75,52),
(41,4,DATEADD(MINUTE,14,(getdate())),DATEADD(MINUTE,21,(getdate())),'D5',87,0),
(42,5,DATEADD(MINUTE,15,(getdate())),DATEADD(MINUTE,21,(getdate())),'E5',95,6),
(43,5,DATEADD(MINUTE,16,(getdate())),DATEADD(MINUTE,21,(getdate())),'F5',10,9),
(44,5,DATEADD(MINUTE,17,(getdate())),DATEADD(MINUTE,21,(getdate())),'H5',11,62)

DECLARE @T_Con2 TABLE(idchung INT, id INT,cot8 VARCHAR(40))
INSERT INTO @T_Con2
VALUES
(11,1,'A8'),
(12,1,'B8'),
(13,4,'C8'),
(14,4,'D8')


DECLARE @T_Con3 TABLE(idchung INT, id INT,cot9 Datetime , cot10 Datetime, cot11 VARCHAR(40))
INSERT INTO @T_Con3
VALUES
(11,5,DATEADD(MINUTE,12,(getdate())),DATEADD(MINUTE,31,(getdate())), 'A11'),
(17,5,DATEADD(MINUTE,16,(getdate())),DATEADD(MINUTE,31,(getdate())), 'B11'),
(18,6,DATEADD(MINUTE,15,(getdate())),DATEADD(MINUTE,31,(getdate())), 'C11'),
(19,7,DATEADD(MINUTE,14,(getdate())),DATEADD(MINUTE,31,(getdate())), 'D11')
[/sql]
Và kết quả mong muốn như hình
Image
Xin cảm ơn anh.

FlyingFox
Guru
Guru
Posts: 816
Joined: Wed 20/04/2011 9:56 am
Been thanked: 325 times

Re: Nhờ nối 4 bảng này thành 1 bảng SQL server

Postby FlyingFox » Thu 20/02/2020 6:37 am

Viết lại cách này cho dể thay đổi.
  1. DECLARE @MeCha TABLE(id INT,cot1 VARCHAR(40) , cot2 VARCHAR(40))
  2. INSERT INTO @MeCha
  3. VALUES
  4. (1,'A1','A2') ,
  5. (2,'B1','B2') ,
  6. (3,'C1','C2') ,
  7. (4,'D1','D2'),
  8. (5,'E1','E2'),
  9. (6,'F1','F2'),
  10. (7,'H1','H2')
  11.  
  12.  
  13. DECLARE @T_Con1 TABLE(idchung INT, id INT, cot3 Datetime , cot4 Datetime, cot5 VARCHAR(40), cot6 INT, cot7 INT)
  14. INSERT INTO @T_Con1
  15. VALUES
  16. (1,1,DATEADD(MINUTE,11,(getdate())),DATEADD(MINUTE,21,(getdate())), 'A5',52,2),
  17. (12,1,DATEADD(MINUTE,12,(getdate())),DATEADD(MINUTE,21,(getdate())),'B5',61,6),
  18. (31,3,DATEADD(MINUTE,13,(getdate())),DATEADD(MINUTE,21,(getdate())),'C5',75,52),
  19. (41,4,DATEADD(MINUTE,14,(getdate())),DATEADD(MINUTE,21,(getdate())),'D5',87,0),
  20. (42,5,DATEADD(MINUTE,15,(getdate())),DATEADD(MINUTE,21,(getdate())),'E5',95,6),
  21. (43,5,DATEADD(MINUTE,16,(getdate())),DATEADD(MINUTE,21,(getdate())),'F5',10,9),
  22. (44,5,DATEADD(MINUTE,17,(getdate())),DATEADD(MINUTE,21,(getdate())),'H5',11,62)
  23.  
  24. DECLARE @T_Con2 TABLE(idchung INT, id INT,cot8 VARCHAR(40))
  25. INSERT INTO @T_Con2
  26. VALUES
  27. (11,1,'A8'),
  28. (12,1,'B8'),
  29. (13,4,'C8'),
  30. (14,4,'D8')
  31.  
  32. DECLARE @T_Con3 TABLE(idchung INT, id INT,cot9 Datetime , cot10 Datetime, cot11 VARCHAR(40))
  33. INSERT INTO @T_Con3
  34. VALUES
  35. (11,5,DATEADD(MINUTE,12,(getdate())),DATEADD(MINUTE,31,(getdate())), 'A11'),
  36. (17,5,DATEADD(MINUTE,16,(getdate())),DATEADD(MINUTE,31,(getdate())), 'B11'),
  37. (18,6,DATEADD(MINUTE,15,(getdate())),DATEADD(MINUTE,31,(getdate())), 'C11'),
  38. (19,7,DATEADD(MINUTE,14,(getdate())),DATEADD(MINUTE,31,(getdate())), 'D11')
  39.  
  40. -- Temporary table
  41. DECLARE @T TABLE(id INT,
  42.                  cot1 VARCHAR(40), cot2 VARCHAR(40),
  43.                  cot3 DATETIME, cot4 DATETIME, cot5 VARCHAR(40), cot6 VARCHAR(40), cot7 VARCHAR(40),
  44.                  cot8 VARCHAR(40),
  45.                  cot9 DATETIME, cot10 DATETIME, cot11 VARCHAR(40),
  46.                  row_id INT)
  47.  
  48. -- Working table result
  49. DECLARE @T_Result TABLE(id INT,
  50.                         cot1 VARCHAR(40), cot2 VARCHAR(40),
  51.                         cot3 DATETIME, cot4 DATETIME, cot5 VARCHAR(40), cot6 VARCHAR(40), cot7 VARCHAR(40),
  52.                         cot8 VARCHAR(40),
  53.                         cot9 DATETIME, cot10 DATETIME, cot11 VARCHAR(40),
  54.                         row_id INT)
  55.  
  56. -- Table @T_Con1 - cot3, cot4, cot5, cot6, cot7
  57. INSERT INTO @T_Result
  58. SELECT a.id, a.cot1, a.cot2,
  59.        b.cot3, b.cot4, b.cot5, b.cot6, b.cot7,
  60.        NULL,
  61.        NULL, NULL,NULL,
  62.        ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY  a.id, b.idchung) AS row_id
  63. FROM @MeCha a
  64. LEFT JOIN @T_Con1 b ON a.id = b.id
  65.  
  66. -- Table @T_Con2 - cot8
  67. INSERT INTO @T
  68. SELECT a.id, a.cot1, a.cot2,
  69.        NULL, NULL, NULL, NULL, NULL,
  70.        b.cot8,
  71.        NULL, NULL, NULL,
  72.        ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY a.id, b.idchung) AS row_id
  73. FROM @MeCha a
  74. LEFT JOIN @T_Con2 b ON a.id = b.id
  75.  
  76. UPDATE @T_Result
  77.    SET cot8 = b.cot8
  78.   FROM @T_Result a
  79.  INNER JOIN @T b ON a.id = b.id AND a.row_id = b.row_id
  80.  
  81. INSERT INTO @T_Result
  82. SELECT * FROM @T b
  83. WHERE NOT EXISTS (SELECT 1 FROM @T_Result WHERE id = b.id AND row_id = b.row_id)
  84.  
  85. -- Table @T_Con3 - cot9, cot10, cot11
  86. DELETE FROM @T
  87. INSERT INTO @T
  88. SELECT a.id, a.cot1, a.cot2,
  89.        NULL, NULL, NULL, NULL, NULL,
  90.        NULL,
  91.        cot9, cot10, cot11,
  92.        ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY a.id, b.idchung) AS row_id
  93. FROM @MeCha a
  94. LEFT JOIN @T_Con3 b ON a.id = b.id
  95.  
  96. UPDATE @T_Result
  97.    SET cot9 = b.cot9, cot10 = b.cot10, cot11 = b.cot11
  98.   FROM @T_Result a
  99.  INNER JOIN @T b ON a.id = b.id AND a.row_id = b.row_id
  100.  
  101. INSERT INTO @T_Result
  102. SELECT * FROM @T b
  103. WHERE NOT EXISTS (SELECT 1 FROM @T_Result WHERE id = b.id AND row_id = b.row_id)
  104.  
  105. SELECT * FROM @T_Result ORDER BY id

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 539
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 189 times
Been thanked: 33 times
Contact:

Re: Nhờ nối 4 bảng này thành 1 bảng SQL server

Postby muaphonui_2010 » Thu 20/02/2020 8:04 am

Cảm ơn anh.
Thật tuyệt vời, đúng ý 100% luôn hehehe. em đã áp dụng thành công rồi nha.


Return to “Ứng dụng Quản lý và Cơ sở dữ liệu”

Who is online

Users browsing this forum: No registered users and 8 guests