使用子查询数据过滤TableAdapters的主SQL查询

时间:2011-11-16 00:51:13

标签: sql asp.net tableadapter

这基本上是一个SQL问题,关于如何使用子选择中的数据来过滤主查询。我正在使用tableadapters但问题是如何在不使用连接的情况下在SQL中执行此操作。我正在使用tableadapters和ASP.NET,如本文所述:

http://msdn.microsoft.com/en-us/library/aa581776.aspx

我的问题是如何坚持不使用联接我的tableadapters的想法(原因在文章中讨论)。我有2个表:电话和PhoneAssociations。 Phones表包含phoneID,cellNumber,name等等.PhonesAssociations表包含有关哪些电话(一对多)与该电话相关联的信息。它包含的东西,如associationID,phoneID,addedByID。我想为tableadapter创建一个查询,该查询返回由单个ID添加的电话数据(单元格,ID,名称)。

如果我没有过滤数据并希望返回所有手机和相关数据,那么sql很简单:

SELECT 
phoneID, 
cellNumber,
providerID, 
password, 
nickname,  
added, 
(SELECT     
addedByID
FROM PhoneAssociations pa
WHERE p.phoneID = pa.addedByID) AS addedByID
FROM Phones AS p 

但我似乎无法弄清楚如何在不使用连接的情况下进行过滤,该列表由addedByID列出,以下不起作用:

SELECT 
phoneID, 
cellNumber,
providerID, 
password, 
nickname,  
added, 
(SELECT     
addedByID
FROM PhoneAssociations pa
WHERE p.phoneID = pa.addedByID) AS addedByID
FROM Phones AS p 
WHERE addedBYID=1

这也不起作用:

WHERE pa.addedBYID=1

这很简单,使用连接,但我找不到使用子选择的语法。那里的任何SQL专家都能指出我正确的方向吗?如果查看该文章,您将看到需要使用子选择而不是连接,以便tableadapters可以创建更新,删除和插入方法。谢谢!

需要退回的记录应该保留原来的phoneID,我需要一个已经通过phoneID of 12添加的所有手机(带有phoneID)的列表 - contractorwolf 16分钟前

我在评论中添加了这个,但也许我应该在问题本身中澄清:

如果我更清楚,电话表中有3条记录,其中phoneIDs为4,8和12条记录,PhoneAssociations表中有2条记录,phoneIDs为4和8,并且addBidID为12,我需要返回的是2 phoneIDs为4和8的记录,因为它们都被12添加了BYID

Phones
4
8
12

PhoneAssociations (addedByID is second column)
4, 12
8, 12

我想回答的是:phoneID 12添加了哪些phoneID? THX

2 个答案:

答案 0 :(得分:1)

Select phoneID
    , cellNumber, providerID, password
    , nickname, added
    , phoneID As addedByID
From Phones AS p 
Where phoneID = 1
    And Exists  (
                Select 1
                From PhoneAssociations As PA1
                Where PA1.addedByID = P.phoneID
                )

答案 1 :(得分:0)

@Thomas - 我稍微修改了你的方法,以便为我提供所需的数据。 我使用的最终查询(以防其他任何人想要解决此类问题)在这里:

SELECT 
phoneID, 
cellNumber, 
providerID, 
password, 
fullName, 
nickname, 
(SELECT 
    providerName 
FROM dbo.CellProviders AS cp 
WHERE p.providerID=cp.providerID) AS providerName 
FROM dbo.Phones as p 
WHERE EXISTS (SELECT 1 FROM PhoneAssociations AS pa 
WHERE pa.phoneID = p.phoneID 
AND pa.addedByID = @addedByID) 

允许我传递addedByID并使用正确的phoneID返回与之关联的手机。 再次感谢@Thomas的回答,它完全弥合了我的差距。 声明本身说“向我提供与PhoneAssociations存在关系的电话数据,其中包含这些记录phoneIDsAddedByID 12(或者@addedByID参数需要的任何内容)。希望有所帮助!