SQL连接和逻辑

时间:2009-12-04 17:17:09

标签: c# sql sharepoint join web-parts

我正在使用我在C#中设计的SharePoint Web部件。我需要查询SQL Server 2005数据库,以返回与用户选择的特定客户关联的计算机的名称。

问题是有不同类型的机器,名称本身存储在其他几个表中。以下是与此问题相关的结构:

我有一个表“customerInfo”,其中包含每个客户的ID和名称。 ID是主键。

表“machineIDs”将客户ID链接到相应的计算机ID。机器ID是主键。

对于两种类型的机器,我有两个表,“machine1”和“machine2”。 machine1包含机器本身的名称,但machine2仅包含机器类型的ID。对于这两个表,机器ID是主键。

然后我有一张桌子“specialMachine”。该表包含机器的名称和此类机器的ID。这里的主键是类型ID,它标识机器的类型,而机器ID标识特定的机器。

我需要做的是仅从客户ID中提取machine1和specialMachine的机器名称。我不确定是否可以直接在查询中使用复杂的连接来执行此操作,或者如果我需要在Web部件中应用逻辑来将这些信息一起提取。

我还想知道如何根据通用模型来考虑这个问题。我希望能够认识到这一点并在将来普遍应用它,因为我确信这是一个相当普遍的问题,我还没有处理过。谢谢。

4 个答案:

答案 0 :(得分:1)

您希望合并两个查询。

SELECT c.ID, m1.Name
FROM customerinfo AS c
JOIN machine1 AS m1
ON m1.customerinfoID = c.ID
WHERE c.ID = @customerID

UNION ALL
SELECT c.ID, sm.Name
FROM customerinfo AS c
JOIN machine2 AS m2
ON m2.customerinfoID = c.ID
JOIN specialtyMachine AS sm
ON sm.TypeID = m2.TypeID
WHERE c.ID = @customerID

答案 1 :(得分:1)

根据您的新架构信息,我猜这是您想要的:

select *
from customerinfo c
left join machineids mids on c.customerid = mids.customerid
left join machine1 m1 on mids.machineid = m1.machineid
left join spcialtymachine sm on mids.machineid = sm.machineid -- or m1.machineid = sm.machineid
left join machine2 m2 on sm.typeid = m2.typeid

注意:如果您在存储过程中使用@customerid作为参数,则可以在末尾添加where c.customerid = @customerid

答案 2 :(得分:0)

您的查询会在客户名称或客户ID中传递并期望得到结果吗?

CustomerInfo和Machine1之间是否存在人行横道表,或者Machine1是否将FK返回给CustomerInfo.Id? Machine2的相同问题

答案 3 :(得分:0)

您的数据模型听起来有点奇怪,但据我所知,没有通用模型,您所谈论的是标准关系数据库。

要进行查询,复杂只是以模块化的方式创建查询的不同部分,如下所示(如果我对键的位置有误,那么模块化方式将使您可以轻松修改以供您使用。)< / p>

首先,机器映射看起来像这样:

Select m2.mid as mID, m1.name as mName
from specialtyMachine sm
left join machine2 m2 on sm.mid = m2.mid 
left join machine1 m1 on sm.machinename = m1.machinename

您可以运行并测试它以查看计算机到ID的映射。

现在我们加入customerinfo:

select * 
from customerinfo c
left join 
(
   Select m2.mid as mID, m1.name as mName
   from specialtyMachine sm
   left join machine2 m2 on sm.mid = m2.mid 
   left join machine1 m1 on sm.machinename = m1.machinename
) t on c.mid = t.mid

这样可以正常工作(并且很适合测试你的关系是否正确),但不好,因为子查询是针对外部查询中的每一行执行的,最好像“解除”它一样

select * 
from customerinfo c
   left join machine2 m2 on c.mid = m2.mid 
   left joint specialtyMachine sm on m2.mid = sm.mid
   left join machine1 m1 on sm.machinename = m1.machinename
告诫:我没有对此进行测试,可能存在错别字。