Tsql 如何在查询中使用表类型
我在新闻表中有9000行,并使用此代码从中选择20行:Tsql 如何在查询中使用表类型,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我在新闻表中有9000行,并使用此代码从中选择20行: Select * From ( Select *, ROW_NUMBER() OVER (ORDER BY DateSend DESC) AS Num From News Where SubjectID in(Select MenuSubject.SubjectID From MenuSubject inner join Menu on MenuSubje
Select *
From (
Select *, ROW_NUMBER() OVER (ORDER BY DateSend DESC) AS Num
From News
Where SubjectID in(Select MenuSubject.SubjectID
From MenuSubject inner join Menu on MenuSubject.MenuID = Menu.MenuID)
) as myTable
where myTable.Num BETWEEN 100 and 120
但阅读的时间是28秒!此外,我使用out join表测试这个查询,并在1秒后得到结果
所以,我想为SELECTJOIN Table使用表类型,并在查询中使用它。我使用以下代码创建了新的表类型:
DECLARE @MyTable2 IntListTable
Insert Into @MyTable2
Select MenuSubject.SubjectID
From MenuSubject inner join Menu on MenuSubject.MenuID = Menu.MenuID
Select *
From (
Select *, ROW_NUMBER() OVER (ORDER BY DateSend DESC) AS Num
From News
Where SubjectID in @MyTable2
) as myTable
where myTable.Num BETWEEN 100 and 120
但是,在
主体在@MyTable2中
错误:
“@MyTable2”附近的语法不正确
编辑:
我使用以下方法测试代码:
Select myTable.Title
或使用以下代码代替联接表:
Where SubjectID in(13,14,20,21,25,24,26,24,28,29,30,54,55,60,47,98,99,65,14,20,33,666,987,254)
在1秒时得到结果
但在查询中使用此代码:
Select myTable.MoreText
阅读的时间是28秒!。为什么 试试这个
Select x.Num
From (
Select *, ROW_NUMBER() OVER (ORDER BY DateSend DESC) AS Num
From News
Where SubjectID in(Select MenuSubject.SubjectID
From MenuSubject inner join Menu on MenuSubject.MenuID = Menu.MenuID)
) x
where x.Num <21
您可以尝试上述查询。此查询中绝对不需要用户定义的表类型。它增加了工作,但没有实际的好处 问题很可能是您正在使用一个IN列表,因为这些IN列表转换为每个值的OR条件。但也不需要一个IN-list 实际上,通过重新考虑内部联接,可以简化此查询,这应该更好,因为它将允许查询优化器完成其工作 挑选* 从…起 选择nw.*,按日期发送订单上的行号,发送描述为[Num] 来自西北新闻 内连接 MenuObject 内部联接菜单 在menusObject.MenuID=Menu.MenuID上 在menusObject.SubjectID=nw.SubjectID上 作为我的桌子 其中myTable.Num介于100和120之间; 最后一个可以简化的方法是,首先将结果转储到本地临时表中,然后在内部联接中使用该结果,尽管我怀疑这里是否需要,因为9000行几乎没有数据: 创建表主题 SubjectID INT NOT NULL-主键-测试有无主键,看看是否有帮助 ; 插入主语 选择MenuObject.SubjectID 来自MenuObject 内部联接菜单 在Menu.MenuID=menusObject.MenuID; 挑选* 从…起 选择nw.*,按日期发送订单上的行号,发送描述为[Num] 来自西北新闻 内部连接主题子 关于sub.SubjectID=nw.SubjectID 作为我的桌子 其中myTable.Num介于100和120之间;
我想从mytable中选择*不选择x.Num,所以我使用x.*时间是28秒,我猜您需要从@MyTable2中选择SubjectID
WITH myTempTable as (Select MenuSubject.SubjectID
From MenuSubject inner join Menu on MenuSubject.MenuID = Menu.MenuID)
Select *
From (
Select *, ROW_NUMBER() OVER (ORDER BY DateSend DESC) AS Num
From News
Where SubjectID in (SELECT SubjectID FROM myTempTable)
) as myTable
where myTable.Num BETWEEN 100 and 120