code_junkie

Trying to build an SQL statement for complex search scenario

Nov 13th, 2011
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.03 KB | None | 0 0
  1. SELECT a.* FROM TableA a INNER JOIN TableB ON b.id = a.id
  2. WHERE
  3. (b.status in (1,6) and b.status IS NOT NULL) AND
  4. b.id NOT IN (SELECT id from TableB WHERE status IS NULL)
  5. AND b.id NOT IN (SELECT id from TableB WHERE status in (2,7))
  6.  
  7. SELECT a.* FROM TableA a INNER JOIN TableB ON b.id = a.id
  8. WHERE
  9. (b.status in (2,7))
  10.  
  11. SELECT a.* FROM TableA a INNER JOIN TableB ON b.id = a.id
  12. WHERE
  13. (b.status IN (1,6) OR b.status IS NULL)
  14. AND b.id NOT IN (SELECT b.id FROM TableA a INNER JOIN TableB b ON b.id = a.id WHERE (b.status IN (1,6) AND b.status IS NOT NULL) AND b.id NOT IN (SELECT id from TableB WHERE status IS NULL))
  15. AND b.id NOT IN (SELECT id FROM TableB WHERE status IN (2,7))
  16.  
  17. select
  18. *
  19. from
  20. A
  21. where
  22. (select count(*) from B where B.parent_id = A.id and B.status in (1,6)) > 0
  23. and (select count(*) from B where B.parent_id = A.id and B.status not in (1,6)) = 0
  24.  
  25. select
  26. *
  27. from
  28. A
  29. where
  30. exists (select * from B where B.parent_id = A.id and B.status in (1,6))
  31. and not exists (select * from B where B.parent_id = A.id and B.status not in (1,6))
  32.  
  33. select
  34. *
  35. from
  36. A
  37. where
  38. (@Criteria = 'Approved'
  39. and (select count(*) from B where B.parent_id = A.id and B.status in (1,6)) > 0
  40. and (select count(*) from B where B.parent_id = A.id and B.status not in (1,6)) = 0
  41. )
  42. or (@Criteria = 'Denied'
  43. and (select count(*) from B where B.parent_id = A.id and B.status in (2,7)) > 0
  44. )
  45. or (@Criteria = 'Pending'
  46. and (select count(*) from B where B.parent_id = A.id and B.status not in (2,7)) = 0
  47. and (select count(*) from B where B.parent_id = A.id and B.status is null) > 0
  48. )
  49.  
  50. - If Any 2 or 7 records => DENIED
  51. - ElseIf Any NULL records => PENDING
  52. - Else => ACCEPTED
  53.  
  54. SELECT
  55. [main].id,
  56. CASE WHEN MAX(CASE WHEN [status].value IN (2,7) THEN 1 ELSE 0 END) = 1 THEN 'DENIED'
  57. WHEN MAX(CASE WHEN [status].value IS NULL THEN 1 ELSE 0 END) = 1 THEN 'PENDING'
  58. ELSE 'ACCEPTED' END
  59. FROM
  60. [main]
  61. INNER JOIN
  62. [status]
  63. ON [main].id = [status].main_id
  64. GROUP BY
  65. [main].id
  66.  
  67. SELECT
  68. [main].id,
  69. MIN(CASE WHEN [status].value IN (2,7) THEN -1 -- Denied
  70. WHEN [status].value IS NULL THEN 0 -- Pending
  71. ELSE 1 END) -- Accepted
  72. FROM
  73. [main]
  74. INNER JOIN
  75. [status]
  76. ON [main].id = [status].main_id
  77. GROUP BY
  78. [main].id
  79.  
  80. DECLARE @map TABLE (
  81. status_value INT,
  82. status_result INT
  83. )
  84.  
  85. INSERT INTO @map VALUES (1, 1)
  86. INSERT INTO @map VALUES (2, -1)
  87. INSERT INTO @map VALUES (6, 1)
  88. INSERT INTO @map VALUES (7, -1)
  89. INSERT INTO @map VALUES (NULL, 0)
  90.  
  91. SELECT
  92. [main].id,
  93. MIN([map].status_result)
  94. FROM
  95. [main]
  96. INNER JOIN
  97. [status]
  98. ON [main].id = [status].main_id
  99. INNER JOIN
  100. @map AS [map]
  101. ON [status].value = [map].status_value
  102. OR ([status].value IS NULL AND [map].status_value IS NULL)
  103. -- # This has been faster than using ISNULLs in my experience...
  104. GROUP BY
  105. [main].id
  106.  
  107. select CASE WHEN SUM(CASE WHEN ISNULL(b.status, 0) IN (1,6) THEN 1 ELSE 0 END) = COUNT(*) THEN 'Approved'
  108. WHEN SUM(CASE WHEN ISNULL(b.status, 0) IN (2,5) THEN 1 ELSE 0 END) > 0 THEN 'Denied'
  109. WHEN SUM(CASE WHEN ISNULL(b.status, 0) IN (1,0,6) THEN 1 ELSE 0 END) = COUNT(*)
  110. AND SUM(CASE WHEN b.status IS NULL THEN 1 else 0 END) > 0 THEN 'Pending'
  111. ELSE '???' END as Status, <a column list>
  112. FROM A
  113. INNER JOIN b ON a.id = b.id
  114. group by <a column list>
  115.  
  116. exists(select 1 from B where A.id = B.id and status in (1,6))
  117. and not exists(select 1 from B where A.id = B.id and (status is null or status not in (1,6)))
  118.  
  119. SELECT
  120. a.*
  121. FROM
  122. TableA a
  123. WHERE
  124. NOT EXISTS (SELECT * FROM TableB b WHERE b.id = a.id AND b.status IN (NULL,1,6))
  125.  
  126. SELECT
  127. a.*
  128. FROM
  129. TableA a
  130. WHERE
  131. EXISTS (SELECT * FROM TableB b WHERE b.id = a.id AND b.status IN (1,6))
  132.  
  133. SELECT
  134. a.*
  135. FROM
  136. TableA a
  137. WHERE
  138. EXISTS (SELECT * FROM TableB b WHERE b.id = a.id AND b.status IS NULL)
  139. AND NOT EXISTS (SELECT * FROM TableB b WHERE b.id = a.id AND b.status IN (1,6))
Add Comment
Please, Sign In to add comment