基于列值有条件地连接到表

时间:2012-10-03 10:53:40

标签: sql join sql-server-2008-r2

我们的下表包含deviceIdcustomerPrefix列。

tblDeviceInfo: 
deviceId       customerPrefix
1             ABC
2             XYZ

根据客户前缀我们也有设备表,我在下面只列出了2但我们有太多它们而且上面的tblDeviceInfo表可以包含许多不同的customerPrefixes,我知道这是一个不好的做法,但这就是我们的意思目前我们必须暂时使用它。

tblDeviceABC
deviceId           deviceName
1              NameABC1
2              NameABC2

tblDeviceXYZ
deviceid           deviceName
1             NameXYZ1
2             NameXYZ2

当我查询tblDeviceInfo(可能包含很多行)时,我希望能够得到以下内容:

deviceId, deviceName, customerPrefix
1            NameABC1          ABC
2            NameXYZ1          XYZ

目前我们从tblDeviceInfo表中获取所有内容,开始循环(在C#app中)并根据客户前缀从相关表中获取设备详细信息, 我想知道是否有一种基于列值加入表的方法,并使用动态sql以一个sql返回所有内容

    @sql = 'Select deviceId, customerPrefix From tblDeviceInfo i
  INNER JOIN tblDevice' + d.customerPrefix + ' d ON d.deviceId = i.deviceId'

这不是很正确,但无论如何使用动态sql或其他任何方式实现这一目标?

由于

2 个答案:

答案 0 :(得分:0)

这不仅仅是不好的做法,也很糟糕。

但是,你可能能够解决这样的问题:

Select deviceId, customerPrefix From tblDeviceInfo i
LEFT OUTER JOIN tblDeviceABC dABC ON dABC.deviceId = i.deviceId
...
LEFT OUTER JOIN tblDeviceXYZ dXYZ ON dXYZ.deviceId = i.deviceId

结果会有很多空检查,但你应该可以在一个(昂贵的)查询中进行。

答案 1 :(得分:0)

您可以union子查询中的所有tblDEVICE并将其与信息表一起加入

SELECT  b.*, a.customerPrefix
FROM    tblDeviceInfo a
        INNER JOIN
        (
            SELECT deviceID, deviceName From tblDeviceABC
            UNION
            SELECT deviceID, deviceName From tblDeviceXYZ
        ) b ON a.deviceID = b.deviceID