校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > SQL Server 開窗函數 Over()代替游標的使用詳解

SQL Server 開窗函數 Over()代替游標的使用詳解

熱門標簽:地圖標注如何弄全套標 電銷機器人 深圳 南京電銷外呼系統哪家好 在電子版地圖標注要收費嗎 武漢AI電銷機器人 萬利達綜合醫院地圖標注點 股票配資電銷機器人 外呼系統會封嗎 實體店地圖標注怎么標

前言:

今天在優化工作中遇到的sql慢的問題,發現以前用了挺多游標來處理數據,這樣就導致在數據量多的情況下,需要一行一行去遍歷從而計算需要的數據,這樣處理的結果就是數據慢,容易卡死。

語法介紹:

1、與Row_Number() 函數結合使用,對結果進行排序,這個是我們使用的非常多的

  

2、與聚合函數結合使用,利用over子句的分組和排序,對需要的數據進行操作

例如:SUM() Over() 累加值、AVG() Over() 平均數
MAX() Over() 最大值、MIN() Over() 最小值

具體介紹:

下面模擬工作中通過開窗函數代替游標的例子,通過期初余額與單據的預收金額、應收金額、實收金額來計算截止本單的期末余額,在以往就是通過游標一行一行去遍歷,計算需要的期末余額,現在使用SUM() Over()來代替,最終要實現的效果圖如下:

第一行表示標題;第二行表示客戶,是一行空行;第三行是期初余額,只顯示期末余額的數據,第四至第六行表示的是每種單據的余額情況,并逐步匯總當前行的期末余額數據;最后一行表示的是對客戶的合計。

1、構建需要用到的表和數據(簡略版)

--客戶表
CREATE TABLE Organization(
 FItemID  INT NOT NULL PRIMARY KEY IDENTITY(1,1),
 FNumber  NVARCHAR(255),
 FName  NVARCHAR(255)
)
 
--期初數據表
CREATE TABLE InitialData(
 FID   INT NOT NULL PRIMARY KEY IDENTITY(1,1),
 FCustId   INT NOT NULL,
 FPreAmount  DECIMAL(28,10) NOT NULL DEFAULT(0),  --預收金額
 FReceivableAmount DECIMAL(28,10) NOT NULL DEFAULT(0),  --應收金額
 FReceiveAmount  DECIMAL(28,10) NOT NULL DEFAULT(0)  --實收金額
)
 
--單據明細表
CREATE TABLE DetailData(
 FID   INT NOT NULL PRIMARY KEY IDENTITY(1,1),
 FCustId   INT NOT NULL,
 FDate   DATETIME NOT NULL,
 FBillType  NVARCHAR(64) NOT NULL,
 FBillNo   NVARCHAR(64) NOT NULL,
 FPreAmount  DECIMAL(28,10) NOT NULL DEFAULT(0),  --預收金額
 FReceivableAmount DECIMAL(28,10) NOT NULL DEFAULT(0),  --應收金額
 FReceiveAmount  DECIMAL(28,10) NOT NULL DEFAULT(0)  --實收金額
)
 
INSERT INTO Organization(FNumber,FName) VALUES('001','北京客戶')
INSERT INTO Organization(FNumber,FName) VALUES('002','上海客戶')
INSERT INTO Organization(FNumber,FName) VALUES('003','廣州客戶')
 
INSERT INTO InitialData(FCustId,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(1,0,0,0)
INSERT INTO InitialData(FCustId,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(2,8000,7245,0)
INSERT INTO InitialData(FCustId,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(3,0,1068.21,1068.00)
 
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(1,'2020-06-30','委托結算','XSD20200700008',0,1221.56,0)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(1,'2020-06-30','委托結算','XSD20200700009',0,373.46,0)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(1,'2020-06-30','委托結算退貨','XSD20200700010',0,-427.05,0)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(1,'2020-07-30','銷售商品返利','XSFL20200700005',0,-17.9,0)
 
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(2,'2020-06-25','預收退款','SKD20200700002',-755,0,0)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(2,'2020-06-20','銷售發貨','XSD20200700006',0,6169.50,6169.50)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(2,'2020-07-30','銷售總額返利','XSFL20200700002',0,-493.56,-421.85)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(2,'2020-07-31','其他應收','QTYS20200900001',0,6000.00,0)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(2,'2020-06-20','預收沖應收','HXD20200700006',-7245.00,0,7245.00)
 
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(3,'2020-06-30','銷售收款','SKD20200700003',0,0,2386.96)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(3,'2020-06-30','應收轉應收','HXD20200700007',0,2386.75,0)
INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
VALUES(3,'2020-07-08','銷售退貨','XSD20200700014',0,-46.80,0)
GO

2、以往的游標寫法

SET NOCOUNT ON
--建立臨時表處理獲取數據
CREATE TABLE #DATA(
 FID   INT NOT NULL PRIMARY KEY IDENTITY(1,1),
 FClassTypeId  INT NOT NULL,
 FCustId   INT NOT NULL,
 FNumber   NVARCHAR(255),
 FName   NVARCHAR(255),
 FDate   DATETIME NULL,
 FBillType  NVARCHAR(64) NULL,
 FBillNo   NVARCHAR(64) NULL,
 FPreAmount  DECIMAL(28,10) NOT NULL DEFAULT(0),  --預收金額
 FReceivableAmount DECIMAL(28,10) NOT NULL DEFAULT(0),  --應收金額
 FReceiveAmount  DECIMAL(28,10) NOT NULL DEFAULT(0),  --實收金額
 FBalanceAmount  DECIMAL(28,10) NOT NULL DEFAULT(0)    --期末余額
)
 
Declare @Id     INT
Declare @CustId    INT
Declare @PreAmount   decimal(28,10)
Declare @ReceivableAmount decimal(28,10)
Declare @ReceiveAmount  decimal(28,10)
Declare @OldCustId   int
Declare @Count    int
Declare @LastAmount   decimal(28,10)
Declare @SumPreAmount  decimal(28,10)
Declare @SumReceivableAmount decimal(28,10)
Declare @SumReceiveAmount decimal(28,10)
Declare @SumBalanceAmount decimal(28,10)
 
--使用游標
Declare Data_cursor Cursor
For Select FID,FCustId,FPreAmount,FReceivableAmount,FReceiveAmount
 From DetailData
 Order By FCustId,FDate,FID
OPEN Data_cursor
FETCH NEXT FROM Data_Cursor INTO @Id,@CustId,@PreAmount,@ReceivableAmount,@ReceiveAmount
SET @OldCustId = @CustId
SET @Count = 0
SET @LastAmount = 0
SET @SumPreAmount = 0
SET @SumReceivableAmount = 0
SET @SumReceiveAmount = 0
SET @SumBalanceAmount = 0
WHILE @@FETCH_STATUS = 0
BEGIN 
 IF @Count > 0
 BEGIN
  IF @OldCustId > @CustId 
  BEGIN
   --表示客戶已經變了,要插入小計
   SET @Count = 0
   INSERT INTO #DATA(FClassTypeId,FBillType,FCustId,FNumber,FName,FPreAmount,FReceivableAmount,FReceiveAmount,FBalanceAmount)
   SELECT -9999,FName + '小計',FItemID,FNumber,FName,@SumPreAmount,@SumReceivableAmount,@SumReceiveAmount,@LastAmount
   FROM Organization
   WHERE FItemID = @OldCustId
   Select @SumPreAmount=0,@SumReceivableAmount=0,@SumReceiveAmount=0,@SumBalanceAmount=0,@LastAmount=0
  END  
 END 
 IF @Count = 0
 BEGIN
  Set @OldCustId=@CustId
  --插入一行空行
  INSERT INTO #DATA(FClassTypeId,FBillType,FCustId,FNumber,FName)
  SELECT -1000,FName,FItemID,FNumber,FName
  FROM Organization
  WHERE FItemID = @CustId
 
  --獲取期初的期末余額
  SELECT @LastAmount=isnull(FReceivableAmount,0) - isnull(FPreAmount,0) - isnull(FReceiveAmount,0),@PreAmount=isnull(FPreAmount,0),@ReceivableAmount=isnull(FReceivableAmount,0),@ReceiveAmount=isnull(FReceiveAmount,0)
  FROM InitialData
  WHERE FCustId = @CustId
 
  INSERT INTO #DATA(FClassTypeId,FBillType,FCustId,FNumber,FName,FBalanceAmount)
  VALUES(-1000,'期初余額',@CustId,'','',@LastAmount)
 
  SELECT @Count = 1
  SELECT @SumBalanceAmount = @LastAmount
 END 
 
 --插入單據明細
 INSERT INTO #DATA(FClassTypeId,FCustId,FNumber,FName,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount,FBalanceAmount)
 SELECT 0,d.FCustId,o.FNumber,o.FName,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount,@LastAmount + FReceivableAmount - FPreAmount - FReceiveAmount
 FROM DetailData d
 INNER JOIN Organization o ON d.FCustId = o.FItemID
 WHERE d.FCustId = @CustId AND FID = @Id
 
 SELECT
 @LastAmount = @LastAmount + FReceivableAmount - FPreAmount - FReceiveAmount,
 @SumPreAmount=@SumPreAmount + FPreAmount,@SumReceivableAmount=@SumReceivableAmount + FReceivableAmount,
 @SumReceiveAmount=@SumReceiveAmount + FReceiveAmount
 FROM DetailData
 WHERE FCustId = @CustId AND FID = @Id
 
 FETCH NEXT FROM Data_cursor INTO @Id,@CustId,@PreAmount,@ReceivableAmount,@ReceiveAmount
END
IF @Count > 0
BEGIN
 INSERT INTO #DATA(FClassTypeId,FBillType,FCustId,FNumber,FName,FPreAmount,FReceivableAmount,FReceiveAmount,FBalanceAmount)
 SELECT -9999,FName + '小計',FItemID,FNumber,FName,@SumPreAmount,@SumReceivableAmount,@SumReceiveAmount,@LastAmount
 FROM Organization
 WHERE FItemID = @OldCustId
 Select @SumPreAmount=0,@SumReceivableAmount=0,@SumReceiveAmount=0,@SumBalanceAmount=0,@LastAmount=0
END
CLOSE Data_cursor
DEALLOCATE Data_cursor
 
SELECT * FROM #DATA
ORDER BY FCustId,FID
 
DROP TABLE #DATA

代碼說明:創建了一個臨時表,使用游標遍歷我們的DetailData數據表,為了呈現我們最終需要的數據樣式,插入客戶空行、期初余額、單據信息、客戶小計等,逐行計算期末余額值的情況,最終效果如下:

3、使用SUM() Over()的寫法

SET NOCOUNT ON
--建立臨時表處理獲取數據
CREATE TABLE #DATA(
 FID     INT NOT NULL PRIMARY KEY IDENTITY(1,1),
 FClassTypeId  INT NOT NULL,
 FCustId    INT NOT NULL,
 FNumber    NVARCHAR(255),
 FName    NVARCHAR(255),
 FDate    DATETIME NULL,
 FBillType   NVARCHAR(64) NULL,
 FBillNo    NVARCHAR(64) NULL,
 FPreAmount   DECIMAL(28,10) NOT NULL DEFAULT(0),  --預收金額
 FReceivableAmount DECIMAL(28,10) NOT NULL DEFAULT(0),  --應收金額
 FReceiveAmount  DECIMAL(28,10) NOT NULL DEFAULT(0),  --實收金額
 FBalanceAmount  DECIMAL(28,10) NOT NULL DEFAULT(0)  --期末余額
)
 
--插入空行
INSERT INTO #DATA(FClassTypeId,FBillType,FCustId,FNumber,FName)
SELECT -1000,FName,FItemID,FNumber,FName
FROM Organization o
INNER JOIN (SELECT FCustId FROM DetailData GROUP BY FCustId) d ON d.FCustId = o.FItemID
 
--插入期初余額
INSERT INTO #DATA(FClassTypeId,FBillType,FCustId,FNumber,FName,FBalanceAmount)
SELECT -1000,'期初余額',FItemID,'','',i.FReceivableAmount - i.FPreAmount -i.FReceiveAmount
FROM Organization o
INNER JOIN InitialData i ON o.FItemID = i.FCustId
INNER JOIN (SELECT FCustId FROM DetailData GROUP BY FCustId) d ON d.FCustId = o.FItemID
 
--插入單據明細(關鍵代碼SUM() Over() )
INSERT INTO #DATA(FClassTypeId,FCustId,FNumber,FName,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount,FBalanceAmount)
SELECT 0,d.FCustId,o.FNumber,o.FName,d.FDate,d.FBillType,d.FBillNo,d.FPreAmount,d.FReceivableAmount,d.FReceiveAmount,
SUM(d.FReceivableAmount - d.FPreAmount - d.FReceiveAmount) OVER(PARTITION BY d.FCustId ORDER BY d.FCustId,d.FDate,d.FID)
+ i.FReceivableAmount - i.FPreAmount - i.FReceiveAmount
FROM DetailData d WITH(NOLOCK)
INNER JOIN Organization o WITH(NOLOCK) ON o.FItemID = d.FCustId
INNER JOIN InitialData i WITH(NOLOCK) ON o.FItemID = i.FCustId
ORDER BY d.FCustId,d.FDate,d.FID
 
--插入小計
INSERT INTO #DATA(FClassTypeId,FBillType,FCustId,FNumber,FName,FPreAmount,FReceivableAmount,FReceiveAmount,FBalanceAmount)
SELECT -9999,FName + '小計',d.FCustId,FNumber,FName,SUM(FPreAmount),SUM(FReceivableAmount),SUM(FReceiveAmount),0
FROM dbo.DetailData d
INNER JOIN dbo.Organization o ON d.FCustId = o.FItemID
GROUP BY d.FCustId,o.FName,o.FNumber
 
--更新小計的期末余額
UPDATE d SET d.FBalanceAmount = d.FReceivableAmount - d.FPreAmount - d.FReceiveAmount + i.FReceivableAmount - i.FPreAmount - i.FReceiveAmount
FROM #DATA d
INNER JOIN InitialData i ON d.FCustId = i.FCustId
WHERE d.FClassTypeId = -9999
 
SELECT * FROM #DATA
ORDER BY FCustId,FID
 
DROP TABLE #DATA

代碼說明:相比第二種,去除了游標的寫法,通過了

SUM(d.FReceivableAmount - d.FPreAmount - d.FReceiveAmount) OVER(PARTITION BY d.FCustId ORDER BY d.FCustId,d.FDate,d.FID)

來計算我們需要的值,這個語法說明一下,sum是累加計算,計算應收金額 - 預收金額 - 實收金額(第二行計算出來的結果要加上第一行計算出來的結果,第三行計算出來的結果要加上第二行計算出來的結果,依次類推,所以,其他聚合函數也是這種用法哦),PARTITION BY分組統計客戶,并通過Order by指定排序
這個PARTITION BY和Order By結果的用法就很關鍵了,不然計算就不是預期想要的
再舉個例子:比如使用Count() Over() 計算客戶的訂單號

SELECT DISTINCT FCustId,COUNT(FBillNo) OVER(PARTITION BY FCustId) FBillNum FROM DetailData

總結:

1、游標的使用場景可以很廣,但是在數據量大的時候,就會顯得很慢,一行一行遍歷的速度還是挺久的

2、使用開窗函數來實現一些功能,還是很方便能實現效果,并且它的速度也是很快,值得推薦。

到此這篇關于SQL Server 開窗函數 Over()代替游標的使用的文章就介紹到這了,更多相關SQL Server 開窗函數 Over()內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • SQL server 自增ID--序號自動增加的字段操作
  • SQL Server中identity(自增)的用法詳解
  • SqlServer生成連續數字根據指定的數字操作
  • SQL Server中row_number函數的常見用法示例詳解
  • SQL Server如何通過創建臨時表遍歷更新數據詳解
  • 解決sql server保存對象字符串轉換成uniqueidentifier失敗的問題

標簽:安徽 濟寧 汕頭 武威 廣東 臺州 濟源 泰安

巨人網絡通訊聲明:本文標題《SQL Server 開窗函數 Over()代替游標的使用詳解》,本文關鍵詞  SQL,Server,開窗,函數,Over,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL Server 開窗函數 Over()代替游標的使用詳解》相關的同類信息!
  • 本頁收集關于SQL Server 開窗函數 Over()代替游標的使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    久久综合久久综合久久| 91久久奴性调教| 欧美日韩不卡视频| 国产精品毛片a∨一区二区三区| 亚洲gay无套男同| 97se狠狠狠综合亚洲狠狠| 日韩欧美的一区二区| 亚洲精品伦理在线| 成人综合日日夜夜| 337p粉嫩大胆噜噜噜噜噜91av | 4438亚洲最大| 最近日韩中文字幕| 国产精品1区2区| 精品国产伦一区二区三区观看体验 | 日本一区二区在线不卡| 日韩激情视频在线观看| 欧美性三三影院| 成人免费在线视频| 国产aⅴ综合色| 久久久电影一区二区三区| 日本不卡视频在线| 69av一区二区三区| 午夜视频一区在线观看| 欧美在线短视频| 1区2区3区国产精品| 风间由美一区二区三区在线观看| 精品美女在线播放| 美女久久久精品| 这里只有精品视频在线观看| 午夜精品福利视频网站| 欧美丝袜第三区| 亚洲综合一区二区三区| 91久久免费观看| 亚洲一区二区在线观看视频| 91女神在线视频| 亚洲日本一区二区三区| 91原创在线视频| 亚洲人成精品久久久久久| 波多野结衣在线一区| 国产精品午夜在线观看| 成人免费观看视频| 国产精品免费久久| 成人亚洲一区二区一| 国产精品网站导航| 成人av先锋影音| 亚洲精品一二三| 欧美视频自拍偷拍| 日韩黄色在线观看| 日韩欧美色电影| 国产曰批免费观看久久久| 久久久亚洲国产美女国产盗摄 | 国产呦萝稀缺另类资源| 国产亚洲人成网站| 波波电影院一区二区三区| 中文幕一区二区三区久久蜜桃| 成人av中文字幕| 夜夜嗨av一区二区三区网页 | 884aa四虎影成人精品一区| 亚洲成a人片在线观看中文| 欧美一区二区三区在线| 国内成人自拍视频| 国产欧美日本一区二区三区| 成人h动漫精品一区二| 亚洲精品成人悠悠色影视| 欧美日本免费一区二区三区| 秋霞电影网一区二区| 欧美sm美女调教| 成人国产亚洲欧美成人综合网| 亚洲四区在线观看| 欧美日韩dvd在线观看| 精品无码三级在线观看视频| 中文字幕欧美激情一区| 在线视频一区二区三| 日韩高清欧美激情| 久久精品一区二区三区四区| av激情综合网| 亚洲成人午夜影院| 久久精品人人做人人综合| 91免费看`日韩一区二区| 午夜激情一区二区| 国产欧美日韩在线看| 欧美三级电影精品| 国产精品白丝jk黑袜喷水| 一区二区三区免费在线观看| 日韩亚洲欧美综合| a级精品国产片在线观看| 亚洲bdsm女犯bdsm网站| 久久久国产综合精品女国产盗摄| 色偷偷88欧美精品久久久| 日本麻豆一区二区三区视频| 欧美精彩视频一区二区三区| 欧美在线观看视频在线| 精品一区二区久久久| 亚洲色图在线播放| 日韩欧美国产wwwww| 色综合天天综合色综合av| 美女视频网站久久| 亚洲天堂久久久久久久| 精品美女在线观看| 91成人在线观看喷潮| 国产精品一区二区久激情瑜伽| 亚洲理论在线观看| 久久综合色8888| 欧美美女一区二区| kk眼镜猥琐国模调教系列一区二区| 日韩精品91亚洲二区在线观看| 中文久久乱码一区二区| 日韩午夜av电影| 91麻豆国产香蕉久久精品| 激情文学综合网| 亚洲高清不卡在线观看| 欧美激情一区二区三区不卡| 欧美一级在线免费| 欧美亚洲一区二区在线| 国产成人av一区二区| 日韩av电影免费观看高清完整版| 综合久久国产九一剧情麻豆| 欧美va在线播放| 91麻豆精品国产自产在线观看一区| 一本久道中文字幕精品亚洲嫩| 国产原创一区二区三区| 免费精品99久久国产综合精品| 亚洲一区免费在线观看| 国产精品家庭影院| 国产欧美精品一区二区色综合 | 色综合久久综合网97色综合 | 午夜一区二区三区视频| 1024亚洲合集| 日本一区二区三区在线观看| 欧美大片在线观看一区二区| 欧美欧美欧美欧美| 91视视频在线观看入口直接观看www | 亚洲成av人片在线观看| 国产精品久久国产精麻豆99网站| 久久日一线二线三线suv| 欧美一区午夜精品| 欧美日韩综合在线免费观看| 91成人免费电影| 99re视频精品| 91小视频在线| 波多野结衣中文字幕一区二区三区| 国产成人精品影视| 国产麻豆91精品| 久久成人免费网站| 麻豆精品一区二区av白丝在线| 日本欧美一区二区三区| 日韩国产在线观看一区| 99精品视频在线免费观看| 豆国产96在线|亚洲| 国产91综合网| 国产91丝袜在线播放| 国产精品中文有码| 国产成a人亚洲精| 国产a久久麻豆| 成人国产精品免费观看| 北岛玲一区二区三区四区| 成人av免费在线| 99国产精品久久久久久久久久| 99热这里都是精品| 91免费在线看| 欧美视频你懂的| 欧美精品xxxxbbbb| 91精品国产综合久久久久久久| 91精品久久久久久蜜臀| 日韩一本二本av| 久久综合狠狠综合| 国产精品麻豆网站| 亚洲人妖av一区二区| 亚洲精品精品亚洲| 五月天中文字幕一区二区| 日本欧美一区二区在线观看| 久久精品国产99国产精品| 国产精品18久久久久久久久久久久| 成人精品一区二区三区中文字幕| jizz一区二区| 欧美专区日韩专区| 69堂亚洲精品首页| 久久久久久久久蜜桃| ...av二区三区久久精品| 亚洲精品菠萝久久久久久久| 亚洲成人午夜影院| 久久91精品国产91久久小草| 国产精品一级在线| 99久久精品国产导航| 欧美性生交片4| 欧美电视剧免费观看| 欧美高清在线一区| 一区二区三区日韩欧美| 青草国产精品久久久久久| 国产精品一区二区免费不卡| 91麻豆国产在线观看| 91精品国产福利在线观看 | 在线一区二区观看| 日韩一区二区不卡| 中文子幕无线码一区tr| 亚洲国产精品人人做人人爽| 精品综合免费视频观看| 99精品久久只有精品| 在线播放91灌醉迷j高跟美女| 久久这里只有精品6|