Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
C# SQL连接和逻辑_C#_Sql_Sharepoint_Join_Web Parts - Fatal编程技术网

C# SQL连接和逻辑

C# SQL连接和逻辑,c#,sql,sharepoint,join,web-parts,C#,Sql,Sharepoint,Join,Web Parts,我正在使用我正在用C#设计的SharePoint web部件。我需要查询SQLServer2005数据库,以返回由用户选择的与特定客户关联的机器的名称 问题是有不同类型的机器,而名称本身存储在其他几个表中。以下是与此问题相关的结构: 我有一个表“customerInfo”,其中包含每个客户的ID和名称。ID是主键 表“machineIDs”将客户ID链接到相应的机器ID。机器ID是主键 我有两个表用于两种类型的机器,“machine1”和“machine2”。machine1包含机器本身的名称,

我正在使用我正在用C#设计的SharePoint web部件。我需要查询SQLServer2005数据库,以返回由用户选择的与特定客户关联的机器的名称

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

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

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

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

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

我需要做的是从machine1和specialtyMachine中提取机器名,只给出客户ID。我不确定是否可以直接在查询中使用复杂连接来实现这一点,或者是否需要在web部件中应用逻辑来将这些信息拉到一起


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

您的查询是否会传入客户名称或客户Id并期望得到结果


CustomerInfo和Machine1之间是否有人行横道表,或者Machine1是否有返回CustomerInfo.Id的FK?对于Machine2,同样的问题

您希望合并两个查询

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

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

要进行复杂的查询,只需以如下所示的模块化方式创建查询的不同部分(如果我对键的位置有错误,那么模块化方式将便于修改以供您使用)

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

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

警告:我没有对此进行测试,可能有输入错误。

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

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作为参数的存储过程中使用它,您可以在末尾添加一个
,其中c.customerid=@customerid

您可以添加一些我们需要处理此类查询的远程结构/模式吗?我刚刚在模式中添加了一些更多信息。我认为它现在包含了所有相关信息。我更新了模式,以显示将客户ID链接到各自机器的表。查询将只传递客户ID。数据模型有点奇怪,但从技术上讲是3NF。业务数据让它有点混乱;尽管每台机器都有一个唯一的标识符,但一种类型的机器由唯一的名称引用,而另一种类型由唯一的类型引用。为了用户的简单性,我必须给他们这些名称,而不是我们的数据库引用它们的唯一标识符。这非常接近。事实上,它确实拉了我需要的所有行,而且只拉了我需要的行。但是,它不会填充“sm”(使用您的名称)字段。这是因为sm.machineid和mids.machineid不是等价物。每个客户都有一定数量的机器(mids.machineid)。只有某些机器具有sm.machineid,然后将它们链接到specialtymachine表。所以这两台机器是不同的,这就是让我困惑的问题,如何归还我需要的田地。非常感谢。您以前的查询在让我接近这个查询和理解内部联接如何工作方面已经非常有用。我几分钟后就要下班了,但我会在星期一早上把它拿回来。再次感谢。好的。。。这是否意味着sm.machineid是customerinfo(或其他表之一)中的另一个字段,或者只是sm.machineid具有所有machineid的子集。如果它是一个子集,则可以正常工作。如果是不同的外键字段,我需要知道名称。此外,如果某个机器ID位于一个表中,而其他机器ID位于另一个表中,则它将显示为多行。然后需要进行一些分组(不用担心,这并不难);sm.machineid不是mids.machineid的子集。例如,假设我有一个客户的客户ID为“1001”。在mids表中,他们将有三个不同的机器ID:“5024”、“6708”和“9699”。对于“5204”和“6708”,我可以简单地从machine1.machinename中提取相应的名称。然而,对于'9699',该产品的信息在machine2中,它没有machinename,而是一个不同的machineid(比如说“192”)。这将它链接到sm,其中包含我需要使用的名称。我将此标记为答案。正如我所说,这将返回我需要的所有行,并且只返回我需要的行;根据我的模式稍作修改,我就可以添加另一个左连接,并仅使用客户ID从sm表中提取附加信息。谢谢!