Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如何在查询中使用表类型_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Tsql 如何在查询中使用表类型

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

我在新闻表中有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 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