SQL - 根据条件连接表

时间:2013-02-25 02:58:32

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

我需要在列DBName上加入以下2个表:

表A

ProductName DbName ServerName
A           DB1    sername
B           DB2    sername
C           DB3    sername
D           DB3    sername

表B

ID DBName ObjectName
1  DB3    objC
2  DB2    objD
3  DB3    objD
4  DB1    objD

这样我就可以获得一个包含以下列的最终表格(即表B +产品名称的所有列):

 ID DBName ObjectName ProductName 

从表AI中可以看出,DB3与2个不同的ProductName(C和D)相关,导致多对多的关系(即如果col在连接后有DB3,则变为2行,一个显示C在ProductName中,一个是D。)

我想做的是按条件获得1-1关系,如果ObjectName是ObjD,那么ProductName是D,如果ObjectName是ObjC,那么ProductName是C.

如果有人能指出我正确的方式来解决这个问题,我将不胜感激......

谢谢!

2 个答案:

答案 0 :(得分:2)

SELECT  a.*, b.ProductName
FROM    tableB a
        INNER JOIN tableA b
            ON  a.DBName = b.DbName  AND
                a.ObjectName LIKE '%' + b.ProductName

上面的查询按预期工作,但肯定会有慢的性能。它将执行FULL TABLE SCAN因为它不使用和索引。

请对表进行规范化,以便搜索使用索引。

以下是建议架构:

表A

  • ProductName
  • DbName
  • 服务器名称

表B

  • ID
  • DBName
  • 的ObjectName
  • ProductName

并在两个表上的ProductName, DbName上定义coumpundcolumn索引。

答案 1 :(得分:2)

那是丑陋的。 (并且可以变慢)。您应该使用整数ID进行连接。

对于你的表格,它将是:

SELECT b.ID, b.DBName, b.ObjectName, a.ProductName
FROM a
  JOIN b
    ON a.DBName = b.DBName
    AND CONCAT('%',a.ProductName) LIKE b.ObjectName

我希望这有效。