随机纸牌生成器优化

时间:2018-10-23 15:42:18

标签: sql oracle

以下是我尝试使用“随机纸牌”生成器随机选择1张纸牌的尝试 (将在以后添加独特的纸牌限额以使其变得更加复杂,并可能将其转换为基于快照的游戏。)

想知道是否有人有优化此查询的提示,或者我使用的任何不良做法。

-- Higher or Lower
-- Deck of Cards

WITH CardNumber AS
                (
                    SELECT 1 col1, 'ACE' col2   FROM dual UNION ALL
                    SELECT 2, 'Two'             FROM dual UNION ALL
                    SELECT 3, 'Three'           FROM dual UNION ALL
                    SELECT 4, 'Four'            FROM dual UNION ALL
                    SELECT 5, 'Five'            FROM dual UNION ALL
                    SELECT 6, 'Six'             FROM dual UNION ALL
                    SELECT 7, 'Seven'           FROM dual UNION ALL
                    SELECT 8, 'Eight'           FROM dual UNION ALL
                    SELECT 9, 'Nine'            FROM dual UNION ALL
                    SELECT 10, 'Jack'           FROM dual UNION ALL
                    SELECT 11, 'Queen'          FROM dual UNION ALL
                    SELECT 12, 'King'           FROM dual
                ) -- Assigns Card Number
                ,
CardType AS     (
                    SELECT 1 col1,'Spades' col2 FROM dual UNION ALL
                    SELECT 2,'Hearts'           FROM dual UNION ALL
                    SELECT 3,'Diamonds'         FROM dual UNION ALL
                    SELECT 4,'Clubs'            FROM dual  
                ) -- Assigns Card Type

-- Draw card
SELECT
            (
                            SELECT b.col2
                            FROM(
                                    SELECT CARD,tank
                                    FROM    (   SELECT CARD,
                                                RANK () OVER(ORDER BY CARD DESC) tank
                                                FROM
                                                        (
                                                            SELECT floor(dbms_random.value(1,12)) CARD
                                                            FROM dual
                                                        ) abc
                                            ) b
                                ) A
                            INNER JOIN CardNumber b
                            ON A.CARD = b.col1 AND a.tank = 1
            ) CARD_NUMBER,
            (
                            SELECT b.col2
                            FROM(
                                    SELECT CARD,tank
                                    FROM    (   SELECT CARD,
                                                RANK () OVER(ORDER BY CARD DESC) tank
                                                FROM
                                                        (
                                                            SELECT floor(dbms_random.value(1,4)) CARD
                                                            FROM dual
                                                        ) abc
                                            ) b
                                ) A
                            INNER JOIN CardType b
                            ON A.CARD = b.col1 AND a.tank = 1
            ) CARD_TYPE
FROM dual;

1 个答案:

答案 0 :(得分:3)

这个评论太长了。

您的代码看起来比我预期的要复杂得多。我希望有一个名为deck的CTE,其甲板上有52张卡片。然后,您将卡片从“卡座”中拉出。

这就像

with CardNumber as ( . . . ),
     CardSuit as ( . . . ),
     Deck as (
      select cs.col2 as suite, cn.col2 as number
      from CardNumber cn cross join
           CardSuit cs
    )
select *
from deck
order by dbms_random.value()
fetch first 1 row only;