2

我在t-sql中写了一个查询,它在子查询中使用了一个函数,并且遇到了两个问题。如下t-sql中的子查询Where子句是否查询每行的数据?

AdID- Name 

的选项表:如下 想象一个广告表

OptionID - OptionName 

而这两个有两个外键列之间的垃圾表(AdvertisementOptionLink):

AdID - OptionID 

现在我想在用户选择选项时查询广告。 我写了一个这样的查询:

SELECT * FROM Advertisement ad 
INNER JOIN AdvertisementOptionLink aol 
WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements) 

现在UDF_GetAdvertisements是表值函数,返回的广告列表有特定选项。

有两个问题:

  1. 这是UDF_GetAdvertisements功能查询所有数据的每一行?我的意思是,如果我在我的桌子上有2000个广告,是否会查询所有这些广告并返回所有广告ID?我最好将函数返回值保存在变量中吗?

2.在这个数据库中有一些没有任何选项的广告如果用户没有选择任何选项,我该如何返回所有广告?

在t-sql中使用表值参数来通过存储过程传递选定的选项ID。 使用本页有些帮助:http://www.sommarskog.se/arrays-in-sql-2008.html

+1

每个问题请提出一个问题。 –

+0

@MartinSmith OK让我们坚持第一个;) – Ashkan

回答

2

您需要检查执行计划。

WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements) 

将作为逻辑semi join运算符来实现。物理连接类型可以是任何合并,散列或嵌套循环。

合并连接和散列连接一次处理每个输入。嵌套循环处理外部输入一次,内部循环多次处理外部输入中的行。但即使TVF显示在嵌套循环连接的内侧,结果也可能被缓存在假脱机缓冲区中,而不是反复重新评估TVF。

+0

Thiks我认为OUTER APPLY是对我的两个问题的答案。 – Ashkan