【问题标题】:SQL - Join tables based on conditionsSQL - 根据条件连接表
【发布时间】:2013-02-25 02:58:31
【问题描述】:

我需要在 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 

正如您从表 A 中看到的,我有与 2 个不同的 ProductName(C 和 D)相关的 DB3,这会导致多对多关系(即,如果 col 在连接后有 DB3,它会变成 2 行,其中一行显示 C在 ProductName 中,一个是 D。)

我想做的是通过如果 ObjectName 是 ObjD 则 ProductName 是 D 并且如果 ObjectName 是 ObjC 那么 ProductName 是 C 的条件来获得 1-1 关系。

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

谢谢!!

【问题讨论】:

  • Re:“如果 ObjectName 是 ObjD,那么 ProductName 是 D”:这不会消除 ID = 2 和 ID = 4 的行吗?
  • 我会把它放在代码的什么地方呢?应该在连接附近的某个地方?
  • 你为什么不发布你想要的输出?这将有助于澄清你想要什么。

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


【解决方案1】:

太丑了。 (并且可能会变慢)。您应该使用整数 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

我希望这行得通。

【讨论】:

  • 非常感谢 - 我会试一试。什么是整数 ID?
  • 抱歉。对于 SQL Server,您似乎必须将 CONCAT('%',a.ProductName) 替换为 '%' + a.ProductName
【解决方案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

  • 产品名称
  • 数据库名称
  • 服务器名称

表B

  • 身份证
  • 数据库名称
  • 对象名称
  • 产品名称

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

【讨论】:

  • 非常感谢 JW!我会试一试。我是 SQL 新手 - 规范化表意味着为每个表创建索引,对吗?
  • 架构是我目前拥有的?将 ProductName 添加到 TableB 正是我在这篇文章中想要实现的目标!
  • @viv_acious 不完全是创建索引,而是建立良好的数据库结构see: Database Normalization Basics
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多