簡體   English   中英

SQL挑戰-顯示具有特定列值的N(1,X或全部)行

[英]SQL Challenge - Display N (1, X or All) rows with a certain column value

這是一個早晨的挑戰:您有一個包含這樣的行的表:

=> select * from candidates;
 id |   name   
----+----------
  1 | JOhn Doe
  2 | Melinda
  3 | Bill
  4 | Jane
(4 rows)

=> select * from evaluation order by id;
 id | score |                reason                
----+-------+--------------------------------------
  1 | RED   | Clueless!
  1 | AMBER | Came in dirty jeans
  2 | GREEN | Competenet and experienced
  2 | AMBER | Was chewing a gum
  3 | AMBER | No experience in the industry sector
  3 | AMBER | Has knowledge gaps
(6 rows)

約翰有紅色,梅林達有綠色和琥珀色,比爾只有琥珀色,而簡還沒有接受采訪。

您的任務(應該選擇接受)是生成一個查詢,該查詢顯示結果以供Boss批准。 老板喜歡將結果呈現為:

  • 如果候選人的身分是綠色,則只顯示綠色,而忽略紅色和琥珀色。
  • 如果應試者有紅色和琥珀色,或者只有琥珀色,則將其全部顯示,但首先顯示紅色分數,因此如果RED真的不好,他可以跳過琥珀色。
  • 對所有尚未面試的候選人顯示“灰色”(“簡”)

游戲規則:

  • 沒有功能! 必須是單個SQL查詢(但是需要多個子查詢)
  • 接受任何SQL變體,但ANSI SQL 92或更高版本可為您帶來更多積分
  • 如果可以,請盡量避免使用內聯變量(在MySQL中為@foo)

我自己的答案與小組思維相符:

SELECT *
FROM   evaluation e1
       NATURAL JOIN candidates
WHERE  score = 'GREEN'
        OR ( score IN ( 'RED', 'AMBER' )
             AND NOT EXISTS (SELECT 1
                             FROM   evaluation e2
                             WHERE  e1.id = e2.id
                                    AND score = 'GREEN') )
UNION
SELECT id,
       'GREY'              AS score,
       'Not yet evaluated' AS reason,
       name
FROM   candidates
WHERE  id NOT IN (SELECT id
                  FROM   evaluation)
ORDER  BY 1,
          2 DESC  

以下是過渡的SQL-92:

SELECT c.name, e.*
  FROM candidates AS c
       JOIN (
             SELECT *
               FROM evaluation
              WHERE score = 'GREEN'
             UNION
             SELECT *
               FROM evaluation AS e1
              WHERE score IN ('AMBER', 'RED')
                    AND NOT EXISTS (
                                    SELECT * 
                                      FROM evaluation AS e2
                                     WHERE e2.id = e1.id
                                           AND e2.score = 'GREEN'
                                   )                                    
            ) AS e 
          ON c.id = e.id
UNION
SELECT c.name, c.id, 'GREY', '(not interviewed)'
  FROM candidates AS c
 WHERE NOT EXISTS (
                   SELECT *
                     FROM evaluation AS e 
                    WHERE e.id = c.id
                   )
ORDER BY id, score DESC;

備用(中級SQL-92):

SELECT c.name, e.id, e.score, e.reason 
  FROM candidates AS c
       JOIN (
             SELECT *
               FROM evaluation
             EXCEPT
             SELECT *
               FROM evaluation
              WHERE score IN ('AMBER', 'RED')
                    AND id IN ( SELECT id FROM evaluation WHERE score = 'GREEN' )
            ) AS e 
          ON c.id = e.id
UNION
SELECT name, id, 'GREY' AS score, '(not interviewed)' AS reason
  FROM candidates
 WHERE id NOT IN ( SELECT id FROM evaluation )
ORDER BY id, score DESC;
SELECT
        c.id                       AS id
      , c.name                     AS name
      , COALESCE(e.score, 'GREY')  AS score
      , e.reason                   AS reason
FROM 
        candidates    c
    LEFT JOIN
        evaluation    e
            ON e.id = c.id
WHERE
        e.score = 'GREEN'
    OR
        NOT EXISTS
          ( SELECT *
            FROM evaluation    ee
            WHERE ee.id = c.id
              AND ee.score = 'GREEN'
          )
ORDER BY
        id      ASC
      , score   DESC 
SELECT A.ID
    , A.NAME
    , B.SCORE
    , B.REASON
FROM CANDIDATES A
LEFT JOIN EVALUATION B
    ON A.ID = B.ID
WHERE B.SCORE = 'GREEN'
UNION
SELECT A.ID
    , A.NAME
    , COALESCE(B.SCORE,'GREY')
    , B.REASON
FROM CANDIDATES A
LEFT JOIN EVALUATION B
    ON A.ID = B.ID
WHERE A.ID NOT IN (SELECT ID FROM EVALUATION WHERE SCORE = 'GREEN')
ORDER BY ID, SCORE DESC;
           SELECT c.id,
               c.name,
               nvl(e.score, 'GREY'),
               nvl(e.reason, 'Not yet interviewed')
          FROM candidates c, evaluation e
         where c.id = e.id(+)
           and ((e.score = 'GREEN') or
               (e.score in ('RED', 'AMBER') and not exists
                (select null
                    from evaluation e2
                   where e2.id = e.id
                     and e2.score = 'GREEN')) or e.score is null)
         order by c.id, e.score desc;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM