Guest User

Untitled

a guest
Jun 21st, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. -- Imagine the following table...
  2. -- --------------------
  3. -- |ID|NAME|VAL |
  4. -- |==|====|============|
  5. -- |A |KEY1|1.0000000000|
  6. -- |A |KEY2|2.0000000000|
  7. -- |B |KEY1|3.0000000000|
  8. -- |B |KEY2|4.0000000000|
  9. -- |B |KEY3|5.0000000000|
  10. -- |C |KEY1|6.0000000000|
  11. -- |D |KEY2|7.0000000000|
  12. -- --------------------
  13.  
  14.  
  15. -- You can flatten out by INNER JOINing. For example...
  16. SELECT a.ID, a.VAL, b.VAL FROM
  17. (SELECT * FROM TEST_TBL WHERE NAME='KEY1') a
  18. INNER JOIN
  19. (SELECT * FROM TEST_TBL WHERE NAME='KEY2') b
  20. ON a.ID=b.ID;
  21. -- Will result in...
  22. -- ----------------------------
  23. -- |ID|VAL |VAL |
  24. -- |==|============|============|
  25. -- |A |1.0000000000|2.0000000000|
  26. -- |B |3.0000000000|4.0000000000|
  27. -- ----------------------------
  28. -- Note that 'A' and 'B' are there because they both contain an entry for 'KEY1' and 'KEY2, but...
  29. -- 'C' is missing because it's missing 'KEY2'
  30. -- 'D' is missing becuase it's missing 'KEY1'
  31.  
  32.  
  33. -- So what if we want to include 'C' and 'D'? The subqueries in our original query need to be changed to include all IDs. So for
  34. -- example, for 'KEY1', LEFT JOIN the all IDs with the IDs that have 'KEY1'...
  35. SELECT a.ID, b.VAL FROM
  36. (SELECT DISTINCT ID FROM TEST_TBL) a -- set of all IDs
  37. LEFT JOIN
  38. (SELECT ID, VAL FROM TEST_TBL WHERE NAME='KEY1') b -- set of IDs/VALs that contain 'KEY1'
  39. ON a.ID = b.ID;
  40. -- Will result in...
  41. -- ---------------
  42. -- |ID|VAL |
  43. -- |==|============|
  44. -- |A |1.0000000000|
  45. -- |B |3.0000000000|
  46. -- |C |6.0000000000|
  47. -- |D |<null> |
  48. -- ---------------
  49.  
  50.  
  51. -- Once you substitute these new subqueries in...
  52. SELECT a.ID, a.VAL, b.VAL FROM
  53. (SELECT aa.ID, ab.VAL FROM (SELECT DISTINCT ID FROM TEST_TBL) aa LEFT JOIN (SELECT ID, VAL FROM TEST_TBL WHERE NAME='KEY1') ab ON aa.ID = ab.ID) a
  54. INNER JOIN
  55. (SELECT ba.ID, bb.VAL FROM (SELECT DISTINCT ID FROM TEST_TBL) ba LEFT JOIN (SELECT ID, VAL FROM TEST_TBL WHERE NAME='KEY2') bb ON ba.ID = bb.ID) b
  56. ON a.ID=b.ID;
  57. -- You'll get the correct results..
  58. -- ----------------------------
  59. -- |ID|VAL |VAL |
  60. -- |==|============|============|
  61. -- |A |1.0000000000|2.0000000000|
  62. -- |B |3.0000000000|4.0000000000|
  63. -- |C |6.0000000000|<null> |
  64. -- |D |<null> |7.0000000000|
  65. -- ----------------------------
Add Comment
Please, Sign In to add comment