• <menu id="gyiem"><menu id="gyiem"></menu></menu>
  • <menu id="gyiem"><code id="gyiem"></code></menu>

    SQL優化(五) PostgreSQL (遞歸)CTE 通用表表達式

    原創文章,轉載請務必將下面這段話置于文章開頭處(保留超鏈接)。
    本文轉發自技術世界原文鏈接 http://www.luozeyang.com/sql/cte/

    CTE or WITH

    WITH語句通常被稱為通用表表達式(Common Table Expressions)或者CTEs。

    WITH語句作為一個輔助語句依附于主語句,WITH語句和主語句都可以是SELECTINSERTUPDATEDELETE中的任何一種語句。

    例講CTE

    WITH語句最基本的功能是把復雜查詢語句拆分成多個簡單的部分,如下例所示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    WITH regional_sales AS (
    SELECT region, SUM(amount) AS total_sales
    FROM orders
    GROUP BY region
    ), top_regions AS (
    SELECT region
    FROM regional_sales
    WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales
    )
    SELECT
    region,
    product,
    SUM(quantity) AS product_units,
    SUM(amount) AS product_sales
    FROM orders
    WHERE region IN (SELECT region FROM top_regions)
    GROUP BY region, product;

    該例中,定義了兩個WITH輔助語句,regional_sales和top_regions。前者算出每個區域的總銷售量,后者了查出所有銷售量占所有地區總銷售里10%以上的區域。主語句通過將這個CTEs及訂單表關聯,算出了頂級區域每件商品的銷售量和銷售額。

    當然,本例也可以不使用CTEs而使用兩層嵌套子查詢來實現,但使用CTEs更簡單,更清晰,可讀性更強。

    在WITH中使用數據修改語句

    文章開頭處提到,WITH中可以不僅可以使用SELECT語句,同時還能使用DELETEUPDATEINSERT語句。因此,可以使用WITH,在一條SQL語句中進行不同的操作,如下例所示。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH moved_rows AS (
    DELETE FROM products
    WHERE
    "date" >= '2010-10-01'
    AND "date" < '2010-11-01'
    RETURNING *
    )
    INSERT INTO products_log
    SELECT * FROM moved_rows;

    本例通過WITH中的DELETE語句從products表中刪除了一個月的數據,并通過RETURNING子句將刪除的數據集賦給moved_rows這一CTE,最后在主語句中通過INSERT將刪除的商品插入products_log中。

    如果WITH里面使用的不是SELECT語句,并且沒有通過RETURNING子句返回結果集,則主查詢中不可以引用該CTE,但主查詢和WITH語句仍然可以繼續執行。這種情況可以實現將多個不相關的語句放在一個SQL語句里,實現了在不顯式使用事務的情況下保證WITH語句和主語句的事務性,如下例所示。

    1
    2
    3
    4
    5
    6
    7
    8
    WITH d AS (
    DELETE FROM foo
    ),
    u as (
    UPDATE foo SET a = 1
    WHERE b = 2
    )
    DELETE FROM bar;

    WITH使用注意事項

    1. WITH中的數據修改語句會被執行一次,并且肯定會完全執行,無論主語句是否讀取或者是否讀取所有其輸出。而WITH中的SELECT語句則只輸出主語句中所需要記錄數。
    2. WITH中使用多個子句時,這些子句和主語句會并行執行,所以當存在多個修改子語句修改相同的記錄時,它們的結果不可預測。
    3. 所有的子句所能“看”到的數據集是一樣的,所以它們看不到其它語句對目標數據集的影響。這也緩解了多子句執行順序的不可預測性造成的影響。
    4. 如果在一條SQL語句中,更新同一記錄多次,只有其中一條會生效,并且很難預測哪一個會生效。
    5. 如果在一條SQL語句中,同時更新和刪除某條記錄,則只有更新會生效。
    6. 目前,任何一個被數據修改CTE的表,不允許使用條件規則,和ALSO規則以及INSTEAD規則。

    WITH RECURSIVE

    WITH語句還可以通過增加RECURSIVE修飾符來引入它自己,從而實現遞歸

    WITH RECURSIVE實例

    WITH RECURSIVE一般用于處理邏輯上層次化或樹狀結構的數據,典型的使用場景是尋找直接及間接子結點。

    定義下面這樣的表,存儲每個區域(省、市、區)的id,名字及上級區域的id

    1
    2
    3
    4
    5
    6
    CREATE TABLE chinamap
    (
    id INTEGER,
    pid INTEGER,
    name TEXT
    );

    需要查出某個省,比如湖北省,管轄的所有市及市轄地區,可以通過WITH RECURSIVE來實現,如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    WITH RECURSIVE result AS
    (
    SELECCT
    id,
    name
    FROM chinamap
    WHERE id = 11
    UNION ALL
    SELECT
    origin.id,
    result.name || ' > ' || origin.name
    FROM result
    JOIN chinamap origin
    ON origin.pid = result.id
    )
    SELECT
    id,
    name
    FROM result;

    結果如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     id  |           name           
    -----+--------------------------
    11 | 湖北省
    110 | 湖北省 > 武漢市
    120 | 湖北省 > 孝感市
    130 | 湖北省 > 宜昌市
    140 | 湖北省 > 隨州市
    150 | 湖北省 > 仙桃市
    160 | 湖北省 > 荊門市
    170 | 湖北省 > 枝江市
    180 | 湖北省 > 神農架市
    111 | 湖北省 > 武漢市 > 武昌區
    112 | 湖北省 > 武漢市 > 下城區
    113 | 湖北省 > 武漢市 > 江岸區
    114 | 湖北省 > 武漢市 > 江漢區
    115 | 湖北省 > 武漢市 > 漢陽區
    116 | 湖北省 > 武漢市 > 洪山區
    117 | 湖北省 > 武漢市 > 青山區
    (16 rows)

    WITH RECURSIVE 執行過程

    從上面的例子可以看出,WITH RECURSIVE語句包含了兩個部分

    • non-recursive term(非遞歸部分),即上例中的union all前面部分
    • recursive term(遞歸部分),即上例中union all后面部分

    執行步驟如下

    1. 執行non-recursive term。(如果使用的是union而非union all,則需對結果去重)其結果作為recursive term中對result的引用,同時將這部分結果放入臨時的working table中
    2. 重復執行如下步驟,直到working table為空:用working table的內容替換遞歸的自引用,執行recursive term,(如果使用union而非union all,去除重復數據),并用該結果(如果使用union而非union all,則是去重后的結果)替換working table

    以上面的query為例,來看看具體過程
    1.執行

    1
    2
    3
    4
    5
    SELECT
    id,
    name
    FROM chinamap
    WHERE id = 11

    結果集和working table為

    1
    11 | 湖北

    2.執行

    1
    2
    3
    4
    5
    6
    SELECT
    origin.id,
    result.name || ' > ' || origin.name
    FROM result
    JOIN chinamap origin
    ON origin.pid = result.id

    結果集和working table為

    1
    2
    3
    4
    5
    6
    7
    8
    110 | 湖北省 > 武漢市
    120 | 湖北省 > 孝感市
    130 | 湖北省 > 宜昌市
    140 | 湖北省 > 隨州市
    150 | 湖北省 > 仙桃市
    160 | 湖北省 > 荊門市
    170 | 湖北省 > 枝江市
    180 | 湖北省 > 神農架市

    3.再次執行recursive query,結果集和working table為

    1
    2
    3
    4
    5
    6
    7
    111 | 湖北省 > 武漢市 > 武昌區
    112 | 湖北省 > 武漢市 > 下城區
    113 | 湖北省 > 武漢市 > 江岸區
    114 | 湖北省 > 武漢市 > 江漢區
    115 | 湖北省 > 武漢市 > 漢陽區
    116 | 湖北省 > 武漢市 > 洪山區
    117 | 湖北省 > 武漢市 > 青山區

    4.繼續執行recursive query,結果集和working table為空
    5.結束遞歸,將前三個步驟的結果集合并,即得到最終的WITH RECURSIVE的結果集

    嚴格來講,這個過程實現上是一個迭代的過程而非遞歸,不過RECURSIVE這個關鍵詞是SQL標準委員會定立的,所以PostgreSQL也延用了RECURSIVE這一關鍵詞。

    WITH RECURSIVE 防止死循環

    從上一節中可以看到,決定是否繼續迭代的working table是否為空,如果它永不為空,則該CTE將陷入無限循環中。
    對于本身并不會形成循環引用的數據集,無段作特別處理。而對于本身可能形成循環引用的數據集,則須通過SQL處理。

    一種方式是使用UNION而非UNION ALL,從而每次recursive term的計算結果都會將已經存在的數據清除后再存入working table,使得working table最終會為空,從而結束迭代。

    然而,這種方法并不總是有效的,因為有時可能需要這些重復數據。同時UNION只能去除那些所有字段都完全一樣的記錄,而很有可能特定字段集相同的記錄即應該被刪除。此時可以通過數組(單字段)或者ROW(多字段)記錄已經訪問過的記錄,從而實現去重的目的。

    WITH RECURSIVE 求最短路徑

    定義無向有環圖如下圖所示
    Non-directional cycle graph

    定義如下表并存入每條邊的權重

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE TABLE graph
    (
    id char,
    neighbor char,
    value integer
    );
    INSERT INTO graph
    VALUES('A', 'B', 3),
    ('A', 'C', 5),
    ('A', 'D', 4),
    ('B', 'E', 8),
    ('B', 'C', 4),
    ('E', 'C', 7),
    ('E','F', 10),
    ('C', 'D', 3),
    ('C', 'F', 6),
    ('F','D', 5);

    計算思路如下:

    • 因為是無向圖,所以首先要將各條邊的id和neighbor交換一次以方便后續計算。
    • 利用WITH RECURSIVE算出所有可能的路徑并計算其總權重。
    • 因為該圖有環,為避免無限循環,同時為了計算路徑,將經過的結點存于數據中,當下一個結點已經在數據中時,說明該結點已被計算。
    • 最終可算出所有可能的路徑及其總權重

    實現如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     WITH RECURSIVE edges AS (
    SELECT id, neighbor, value FROM graph
    UNION ALL
    SELECT neighbor, id, value
    FROM graph
    ),
    all_path (id, neighbor, value, path, depth, cycle) AS (
    SELECT
    id, neighbor, value, ARRAY[id], 1, 'f'::BOOLEAN
    FROM edges
    WHERE id = 'A'
    UNION ALL
    SELECT
    all_path.id,
    edges.neighbor,
    edges.value + all_path.value,
    all_path.path || ARRAY[edges.id],
    depth + 1,
    edges.id = ANY(all_path.path)
    FROM edges
    JOIN all_path
    ON all_path.neighbor = edges.id
    AND NOT cycle
    ), a_f AS (
    SELECT
    rank() over(order by value) AS rank,
    path || neighbor AS path,
    value,
    depth
    FROM all_path
    WHERE neighbor = 'F'
    )
    SELECT path, value, depth
    FROM a_f
    WHERE rank = 1;

    WITH RECURSIVE 使用限制

    • 如果在recursive term中使用LEFT JOIN,自引用必須在“左”邊
    • 如果在recursive term中使用RIGHT JOIN,自引用必須在“右”邊
    • recursive term中不允許使用FULL JOIN
    • recursive term中不允許使用GROUP BY和HAVING
    • 不允許在recursive term的WHERE語句的子查詢中使用CTE的名字
    • 不支持在recursive term中對CTE作aggregation
    • recursive term中不允許使用ORDER BY
    • LIMIT / OFFSET不允許在recursive term中使用
    • FOR UPDATE不可在recursive term中使用
    • recursive term中SELECT后面不允許出現引用CTE名字的子查詢
    • 同時使用多個CTE表達式時,不允許多表達式之間互相訪問(支持單向訪問)
    • 在recursive term中不允許使用FOR UPDATE

    CTE 優缺點

    • 可以使用遞歸 WITH RECURSIVE,從而實現其它方式無法實現或者不容易實現的查詢
    • 當不需要將查詢結果被其它獨立查詢共享時,它比視圖更靈活也更輕量
    • CTE只會被計算一次,且可在主查詢中多次使用
    • CTE可極大提高代碼可讀性及可維護性
    • CTE不支持將主查詢中where后的限制條件push down到CTE中,而普通的子查詢支持

    SQL優化系列

    郭俊 Jason wechat
    歡迎關注作者微信公眾號【大數據架構】
    您的贊賞將支持作者繼續原創分享
    速赢彩app 31325m.com | 2677zzz.com | 67890ppp.com | www.882186.com | www.9570115.com | www.h7788j.com | n21148.com | 5006811.com | www.41518f.com | www.365011.bet | www.63877u.com | 4136g.com | 3413366.com | www.8667o.com | www.4996js.com | www.25288u.com | t888c.com | 7726ooo.com | www.901021.com | www.89386.com | www.9969365.com | feicai0794.com | aa67890.com | www.451956.com | www.68993263.com | www.8967q.com | www.v3302.com | 4255qqq.com | 8988z.com | www.qmkl9.com | www.658060.com | www.js421.com | www.3983139.com | 3405w.com | sbc883.com | www.701545.com | www.83008j.com | pj00oo.com | 463d7.com | www.502135.com | www.b773776.com | www.bwinyz03.com | www.14988.com | www.990960.com | 32126r.net | 38989t.com | 619579.com | www.055i.cc | www.3775t.com | www.c5c44.com | www.zdj70.com | 883399.com | 123888.me | le888r.com | www.929115.com | www.635799.com | www.9170011.com | www.hg6688.com | www.sb8002.com | 808cp.org | 3mgmqqq.com | a32689.net | www.553028.com | www.52072c.com | www.aa00668.com | www.5966ppp.com | www.4938z.com | feicai0898.com | 36400099.com | 71707l.com | c46.cc | 1168z.com | www.666055.cc | www.3126x.com | www.984709.com | www.9737tt.me | www.432kj.com | www.ylzz1119.com | www.21365ss.com | 1082.com | 9895.com | 35252c.com | 3685k.com | 38749.com | 8881207.com | 7893w18.com | www.298730.com | www.927310.com | www.9155d.cc | www.89893.cc | www.9818c.cc | www.08588l.com | www.16065t.com | www.2997779.com | www.5446pp.com | www.15786.com | www.21033.com | www.799msc.com | www.7435z.com | 6137.com | 78117799.com | 1594005.com | xx4455.com | 123456kk.cc | 44uu8332.com | 8988e.com | 83138t.com | wdlywz.com | 2618m.com | 3522aa.cc | 86226.com | 13825522.com | 4590c.com | 3726r.com | 3559hhh.com | 3559ooo.com | 8988gg.com | 7720g.net | 3644m.com | 2190b.com | 7599ss.com | 1489f.com | 88850uu.com | ylzz4446.com | 2127nn.com | xpj3432.com | 62077.net | 0802.com | xpj518.com | 3846ss.com | 58222a.com | dd8662.com | m15666.com | 001122332.com | 00yy8332.com | mgm3242m.com | www.333222u.com | www.yh8333.com | www.3046k.com | www.91684.com | www.3709884.com | www.bb2229.com | www.464699.com | www.tk355.com | www.bet365zh.com | www.680588.com | www.yh234f.com | www.60886e.com | www.362bbb.com | www.js18685.com | www.66376c.com | www.6364m.com | www.901013.com | www.398411.com | www.50074a.com | 33432f.com | 44077f.com | 79889f.com | 915906728.com | 6146s.com | 1cp055.com | 19991.com | www.bet365605.com | www.32126b.net | www.bet445.com | www.19019l.com | www.298001.com | www.3846aa.com | www.js7601.com | www.34489.cc | www.423689.com | ncw060.com | 3656pp.com | 69445599.com | 88807j.com | www.887.ag | www.20326.com | www.xj666o.com | www.1559504.com | www.y98a.com | www.cp8013.cc | www.77803u.com | 11hh8331.com | 3967e.com | fc9098.com | www.yh8003.com | www.hg10978.com | www.pj9346.com | www.v80288.com | www.kywns.205115.com | www.862810.com | 643966.com | 4052v.com | 66185a.net | 12742s.com | www.287720.com | www.288988b.com | www.575477.com | www.055r.cc | www.80065u.com | 1665zz.com | 00773s.com | www.b3654.com | www.3066w.com | www.j3678.com | www.78949m.com | www.611036.com | 426601.com | 65365.com | 22207i.com | www.741199a.com | www.80188g.com | www.77802d.com | www.558402.com | 253509.com | 444365aa.com | www.4625v.com | www.77731x.com | www.55717u.com | www.923733.com | vns8g.com | hga22200.com | www.70.tt | www.a81b.cc | www.hg1245.com | www.643552.com | 7811i.com | qifa168.net | www.55268ll.com | www.7415d.com | www.50074b.com | www.84499v.com | 56787aa.com | 3822b.com | www.366686.com | www.479dh.com | www.858899.com | 0860x.com | xx7742.com | www.hg94777.com | www.1754d.com | www.den00.com | 3559cccc.com | 2443d.com | www.894929.com | www.8877kcd.com | www.663738.com | p2306.com | 3338449.com | www.xpj6238.com | www.9187h.com | www.550264.com | 3846nn.com | 2014.ag | www.458177.com | www.53900j.com | fstppx.com | 8547jj.com | www.4719cc.com | www.i94600.com | www.363116.com | l444000.com | www.1019990.com | www.33111166.com | www.669548.com | 7945ll.com | www.hg3028.com | www.4078v.com | www.979683.com | 6363b.com | www.wxr44.com | www.28000h.com | www.ch8567.com | 4186.com | www.788698.com | www.88325u.com | www.620316.com | 0366.com | www.hg958a.com | www.hg77730.com | hj5068.com:8888 | 52599b.com | www.7878788.com | www.73736d.com | ff555q.com | zz57686.com | www.sb5504.com | www.798288.com | 3143.cc | www.4625w.com | www.7249z.com | 75266.com | hg0886.ws | www.h948h.com | www.cp500.net | 99909n.com | www.333089.com | www.3066hh.com | 33tt8331.com | www.518hwx.com | www.44118g.com | www.022193.com | 55331.com | www.5sj.com | www.hczx6.com | 62620524.com | www.156kai.com | www.26001.com | 3950z.com | www.pj2018.com | www.4833022.com | 97799.com | www.js507710.com | www.vn888123.cc | 8988z.com | www.j854.com | www.hd8674.com | 8294m.com | www.30765.com | www.087938.com | d47479.com | www.v1878.com | www.13434c.com | 36405522.com | www.9679c.com | www.61655h.com | 673305.com | www.130031.com | www.22743.com | 0698e.com | www.495655.com | www.sxyl6.com | 550111f.com | www.5360ss.com | www.501207.com | 2490u.com | www.4996gd.com | jing6222.com | www.ys0022.com | www.635799.com | drcp222.com | www.hg7849.com | www.hld33.com | 3614v.com | www.q3065.com | www.77801o.com | 1775ee.com | www.68993271.com | bt2088.com | www.www727939.com | www.666405.com | 3225l.com | www.07679b.com | qy6682.com | www.a80070.com | www.cp5658.cc | 2555211.com | www.4521j.com | 33678ff.com | www.582666.com | www.hj9798.com | 3365.com | www.7036ss.com | 6002z.com | www.77605b.com | www.683037.com | 33115g.com | www.68993275.com | 9737cc.me | www.4972o.com | 76886y.com | www.00829o.com | www.24czj.com | 11jj8332.com | www.37377s.com | 5478222.com | www.caipioa33.com | 5802oo.com | www.32666r.com | www.927191.com | ttt2848.com | www.13434g.com | 19yl.com | www.2544g5.com | 234902.com | www.c53889.com | b762.xyz | www.pj8474.com | www.345512.com | www.pjxianggang.com | www.3136aa.com | 80368ll.com | www.93gj07.com | yun666.com | www.06387744.com | qjdating.com | www.4hg6668.com | 4880m.com | www.l4042.com | 566pj.com | www.hg8483.com | www.126309.com | www.21365aa.com | www.640505.com | www.hg2083.com | www.980797.com | 7798.com | www.cp8006.cc | 4495.com | www.919309.com | 6567.com | www.927150.com | www.mg4355888.com | www.gocp5.com | hg128.com | www.c4526.com | www.wugou135.com | www.701487.com | www.pjbet333.com | www.366019.com | www.77537a.com | www.192711.com | www.745128.com | www.71233u.com | www.hg0782.com | 6396s.com | www.89456.com | jm8.tw | www.55526h.com | 3522z.vip | www.8313e.com | 500000394.com | www.820032.com | ccc67890.com | www.866067.com | 2997778.com | www.5095e.com | 18438w.com | www.925887.com | www.40818c.com | www.205059.com | www.f8867.com | feicai0520.com | www.y4042.com | pj8dd.com | www.46630.net | 35222ee.com | www.bet73p.com | 预览7792z.com | www.917699.com | www.yh6118.com | v1621.com | www.7817z.vip | 138.am | www.44118u.com | 3650568.com | www.7782b.com | www.682855.com | www.363067.com | www.hg7684.com | pj8ee.com | www.8808598.com | 3845.com | www.5441v.com | www.yinhe9507e.com | www.67258e.com | www.jjjj33333.com | 00ww8331.com | www.hg3006.com | gg4675.com | www.233434.com | www.665888001.com | hg128.xyz | www.111999qipai.com | 7744bbb.com | www.771245.com | www.20288r.com | 3678.com | www.00797b.com | 209899.com | www.235117.com | www.88100.com | 0207893.com | www.ttcp88.co | www.benz4343.com | 228888n.com | www.hg33397.com | 66876j.com | www.rcw8877.com | www.qq599.com | 068089.com | www.54968f.com | www.67797k.com | 2078n.com | www.86339d.com | 88770.cc | 66300vip07.com | www.8473g.com | 35442888.com | www.961219.com | www.ibm888.net | c89kj213.com | www.3479c.com | www.xb0023.com | h21148.com | www.81233b.com | www.9068qq.com | blr81.com | www.yl1981.com | www.y32126.cc | beplay.pub | www.zzyl66.com | www.ylg9939.com | 66458k.com | www.578888.vip | www.90866.cc | 3242s.com | www.1178058.com | www.hy688.com | 35252o.com | www.xinhuangguan.com | www.7111d.com | 5003oo.com | www.60123l.com | www.hg5123.pw | ys-57.co | www.cmc.cc | www.55526t.com | 56787bb.com | www.253529.com | www.bwinyz35.com | hgw168g.com | 88894h.com | www.5953688.com | www.7025y.com | 43234323.com | www.flff2.com | www.01593.com | 4647.com | 7686p.com | www.55717o.com | www.588sun.com | 56988yy.com | www.c300.vip | www.19yh8.com | 3167.com | kkk5144.com | www.65707l.com | www.368915.com | xuxrbmlu.cn | www.33997i.com | www.1941.cc | www.66930011.com | nn1915.com | www.444069.com | www.w84n.com | www.333133o.com | 76886z.com | www.602742.com | www.77658yy.com | www.js85.com | 9522dd.com | www.677397.com | www.7366002.com | www.77077.com | 3121g.com | www.luck887.com | www.47506i.com | www.pu15.com | 083939.com | www.rcw321.com | www.1239999.cc | www.vnsr388.com | raybet39.com | 66300vip32.com | www.87500.com | www.cp67775.com | 3544e.com | s67890.com | www.721588.com | www.b12189.com | www.19888bet.com | 3950y.com | bwin8x.com | www.771478.com | www.129786.com | 457892.com | 5002sss.com | www.586840.com | www.1764d.com | www.64717.com | g2306.com | 996622dd.com | www.c760c.com | www.8017111.com | www.msc269.com | 3379ss.com | 35066.com | www.744559.com | www.1113yl.com | www.fa208.com | 2851a.com | 40014499.com | www.422268.com | www.55545k.com | www.746778.com | www.0888js.com | 5478888.com | xpj6602.com | www.8816e.com | www.88vn777.com | www.330099v.com | xpj6620.com | 76181678.com | www.329209.com | www.910056.com | www.ii55826.com | www.h7788t.com | JS1388n.com | xpj66136.com | www.444019.com | www.7714x.com | www.5446nn.com | www.84299.com | 83086k.com | 4647099.com | 4441164.com | www.977hf.com | www.78680w.com | www.709msc.com | www.737.am | 3416k.com | sj889.net | www.001865.com | www.2875v.com | www.780780b.com | www.3171d.com | www.p31888.com | js89k.vip | 407ll.com | ff555g.com | www.701540.com | www.99788f.com | www.8886hj.com | www.532156.com | 1654o.com | 9068dd.com | 667766u.com | www.60123a.com | www.hx1113.com | www.99094e.com | www.92820.com | www.585234.com | 1594002.com | x33n.vip | 80850cc.com | xpj4828.com | www.314877.com | www.1368x.cc | www.222067a.com? | www.93955a.com | www.lxyl360.com | www.58777a.com | 12742l.com | act88.cc | 38365d.com | 2077bb.com | bowang55.com | www.372918.com | www.13czj.com | www.910057.com | www.838769.com | www.7415d.com | www.js403.com | www.22753.com | www.68666h.com | 8381c.com | 93922b.com | 403237.com | 3434ppp.com | 91019.com | 8977nn.com | hg33311.com | www.178652.com | www.756586.com | www.5086b.com | www.7714x.com | www.4809q.com | www.4196c.com | www.38345w.com | www.am185.com | www.hg2958.com | www.3657k.com | www.280zr.com | 025352.com | 33318u.com | 4018hh.com | 5019kze.com | z1915.com | ms38648ll.cc | 123456nn.cc | 62033.com | 98955y.com | www.040425.com | www.401268.com | www.755907.com | www.cp3158.cc | www.071wy.com | www.9149b.com | www.50052y.com | www.99677j.com | www.yun879.com | www.hd8674.com | www.hg98765.com | www.6664j.com | www.98vs88.com | www.07679i.com | www.40288y.com | www.79095f.com | www.06387733.com | www.47506i.com | www.3577.ag | www.129088.com | www.00778n.com | www.955744.com | www.j7764.com | www.4196a.com | www.480025.com | www.4196v.com | www.2000c.cc | www.32031q.com | www.69567j.com | www.h2894.com | www.9895n.com | www.99552kk.com | www.7036jj.com | www.668puj.com | www.9187n.com | www.win1231.com | www.js7601.com | www.23636e.com | www.39500f.com | www.2934p.com | www.c6356.com | www.824879.com | www.602952.com | www.303053.com | 80368aa.com | 88304j.com | 55ll8331.com | 00774nn.com | 138T.Com | 36400044.com | mg437733.com | 2455u.com | 272ww.net | www.901718.com | www.3643g.com | www.79890m.com | www.654234.com | www.5049r.com | www.16181k.com | www.3032jj.com | www.55717z.com | www.73166l.com | www.ya130.com | www.672766.com | www.103380.com | 11114048.com | 091166.com | 00xpj377.com | 2334vip3.com | 365058.com | www.v0060.com | www.kx151.com | www.pj299299.com | www.bwinyz40.com | www.97828h.vip | www.60007f.com | www.955334.com | www.177741.com | 8970399.com | 28288cc.com | 56987yy.com | xpj888a.com | www.935365.com | www.yh3682.com | www.128088.com | www.614586.com | www.84499c.com | www.926799.com | www.50052i.com | 00778e.com | 4116y.com | 027651.com | www.b3652.com | www.hg5728.com | www.a22.com | www.55676c.com | www.9958c.com | www.379969.com | 915906545.com | 66300vip17.com | wnsr8802.com | www.ou95990.com | www.3844k.com | www.cp9538.com | www.7920o.com | www.5095b.com | www.301345.com | 7003f.com | 34c35.com | 6556m.com | www.xj555666.com | www.c32939.com | www.4828.com | www.910336.com | 2247cc.com | yl66yl77.com | 35252c.com | www.am33333.com | www.899500.cc | www.8zz66.com | www.rrle3.com | 75266.com | 4778822.com | 3178hh.com | www.hg128w.com | www.00772z.com | www.6653g.com | www.567306.com | 2687js.com | 1407w.com | www.32126x.net | www.a9151e.com | www.6zz66.com | www.861150.com | q2306.com | hg873.com | www.6491b.com | www.998855b.com | www.0343i.com | www.810262.com | 22296ww.com | 3685q.com | www.3459e.com | www.11c93.com | www.710502.com | www.516113.com | 5802cc.com | 44002007.com | www.js7888.co | www.3577.ag | www.19czj.com | 5533vn77.com | 7k7k.com | www.3459e.com | www.9737mm.me | www.50090.cc | 5360ee.com | 4488y.com | www.946386.com | www.89599s.com | www.99830.cc | 8988rr.com | 55572949.com | www.7772558.com | www.5bet005.com | www.9155h.cc | yl2827.com | 655661177.com | www.x100100.com | www.535087.com | www.607316.com | 3522e.cc | www.86611e.com | www.500500.com | www.50024t.com | 7945tt.com | k77304.com | www.390338.com | www.89789v.com | www.287926.com | 5622u.com | www.hg8833.co | www.704904.com | www.848255.com | 55967p.com | www.yh8009.com | www.00772y.com | www.fcff2.com | 3678lll.com | 6177009.com | www.58665w.com | www.8667z.com | 8881481.com | 56988vv.com | www.184897.com | www.3416b.com | 16290077.com | 1156.com | www.10999m.com | www.903117.com | p61788.com | www.76543x.com | www.960620.com | www.371931.com | 4107m.com | www.vns78999.com | www.9522888.com | xyccwlkj.com | 3258w.com | www.503013.com | www.23czj.com | 4018rr.com | www.benz4411s.com | www.0600g.cc | www.033826.com | 55545k.com | www.fbs33.com | www.9818d.cc | 728055.com | www.yh1111.cc | www.86339v.com | www.50054o.com | 62365.com | www.2y246.com | www.hr7888.com | 3122n.com | www.32666j.com | www.89777i.com | 66225156.com | 4637700.com | www.35252g.com | www.234279.com | hg77703.com | www.66867.com | www.898338.com | 2222c9.com | www.772345.com | www.3552n.com | 228888y.com | www.hg0634.com | www.76520j.com | 1434c.com | www.qqqqkkkk.com | www.610859.com | o08199.com | www.88699vip.com | www.ylylc02.com | 3066aa.com | www.28758p.com | www.69999.am | 5003ttt.com | www.aobo9.com | www.66074.com | 63305a.com | www.hj4888.com | www.906777.com | 566671144.com | www.boma0151.com | www.585.cc | bo667766.com | www.txck.cc | www.50052s.com | 1697033.com | www.1116609.com | www.can80.com | 888991133.com | www.suncity9.com | www.610659.com | 6766gg.com | www.d69096.com | 21vnsvns.com | www.716988.com | www.1466k.com | 2021www.com | www.92220746.com | www.2373p.com | h4389.com | www.mhcp2.com | www.290727.com | hgyz77.com | www.77201.com | 2455o.com | www.hg0599.com | www.1248h.cc | 78808t.com | www.6666yh.vip | 2389900.cc | www.aobo8877.com | www.703wb.com | 998g.cc | www.60339.com | www.565639.com | 55899e.com | www.js89q.vip | 59889j.com | www.zb933.com | www.aj3383.com | 17500.cn | www.79095v.com | 7811xx.com | www.782881.com | www.823023.com | 2934i.com | www.70669a.com | 131j.net | www.3814b.com | www.356686.com | cp11993.com | www.9286777.com | 1705g.com | www.5049i.com | www.33598o.com | www.30765.com | www.5441y.com | 2096u.com | www.661326.com | 79889f.com | www.44466666.com | www.84499a.com | www.757xpj.com | www.3479p.com | bb2348.com | www.0087k.com | 8a8u.com | www.cpdjl.com | 555vn77.com | www.pj8610.com | www.737689.com | 6177011.com | www.78700n.com | d86226.com | www.650391.com | 32355gg.com | www.996sun.com | v1973.com | www.j6628.com | www.797884.com | js38886.com | www.25688n.com | qq365v.com | www.48330w.com | 1315553.com | www.4996gg.com | vv5443.com | www.jy768.com | 908080f.com | www.hg0800.com | www.83033u.com | www.8655msc.com | www.609810.com | www.xpj9999.cc | www.556zf.com | 2373.com | www.36166t.com | 22jj8332.com | www.yh07.com | 8037ll.com | www.48330b.com | yabo6008.com | www.xpj11885.com | b4116.com | www.http://09991.com | 6033x.com | www.5099nn.com | a5595.net | www.360cp.com | 4255q.com | www.5504k.com | xpj62622.com | www.5504g.com | 1624cc.com | www.448246.com | 2306v.com | www.264438.com | 6146u.com | www.hg8yy.com | 22299kk.com |