代码之家  ›  专栏  ›  技术社区  ›  inDepth

如何将具有varchar主键的表引用或连接到具有INT主键的表(SQL server)

  •  0
  • inDepth  · 技术社区  · 6 年前

    这是我正在使用的数据库。

    Database

    我要做的是将department表引用或联接到project表中。 我应该能够成功地使用以下查询。我需要此查询特定结果

    SELECT P.ProjectID, P.ProjectName, P.Department, D.BudgetCode
    FROM DEPARTMENT D, PROJECT P
    

    此查询成功执行。但是,我的结果中有重复的值,并且格式不正确。这就是我得到的结果

    ProjectID   ProjectName                     Department      BudgetCode
    1000        2010 Q3 Product Plan            Marketing       BC-300-10                     
    1000        2010 Q3 Product Plan            Marketing       BC-100-10                     
    1000        2010 Q3 Product Plan            Marketing       BC-400-10                     
    1000        2010 Q3 Product Plan            Marketing       BC-500-10                     
    1000        2010 Q3 Product Plan            Marketing       BC-800-10                     
    1000        2010 Q3 Product Plan            Marketing       BC-200-10                     
    1000        2010 Q3 Product Plan            Marketing       BC-700-10                     
    1000        2010 Q3 Product Plan            Marketing       BC-600-10                     
    1100        2010 Q3 Portfolio Analysis      Finance         BC-300-10                     
    1100        2010 Q3 Portfolio Analysis      Finance         BC-100-10                     
    1100        2010 Q3 Portfolio Analysis      Finance         BC-400-10                     
    1100        2010 Q3 Portfolio Analysis      Finance         BC-500-10                     
    1100        2010 Q3 Portfolio Analysis      Finance         BC-800-10                     
    1100        2010 Q3 Portfolio Analysis      Finance         BC-200-10                     
    1100        2010 Q3 Portfolio Analysis      Finance         BC-700-10                     
    1100        2010 Q3 Portfolio Analysis      Finance         BC-600-10                     
    1200        2010 Q3 Tax Preparation         Accounting      BC-300-10                     
    1200        2010 Q3 Tax Preparation         Accounting      BC-100-10                     
    1200        2010 Q3 Tax Preparation         Accounting      BC-400-10                     
    1200        2010 Q3 Tax Preparation         Accounting      BC-500-10                     
    1200        2010 Q3 Tax Preparation         Accounting      BC-800-10                     
    1200        2010 Q3 Tax Preparation         Accounting      BC-200-10                     
    1200        2010 Q3 Tax Preparation         Accounting      BC-700-10                     
    1200        2010 Q3 Tax Preparation         Accounting      BC-600-10                     
    1300        2010 Q4 Product Plan            Marketing       BC-300-10                     
    1300        2010 Q4 Product Plan            Marketing       BC-100-10                     
    1300        2010 Q4 Product Plan            Marketing       BC-400-10                     
    1300        2010 Q4 Product Plan            Marketing       BC-500-10                     
    1300        2010 Q4 Product Plan            Marketing       BC-800-10                     
    1300        2010 Q4 Product Plan            Marketing       BC-200-10                     
    1300        2010 Q4 Product Plan            Marketing       BC-700-10                     
    1300        2010 Q4 Product Plan            Marketing       BC-600-10                     
    1400        2010 Q4 Portfolio Analysis      Finance         BC-300-10                     
    1400        2010 Q4 Portfolio Analysis      Finance         BC-100-10                     
    1400        2010 Q4 Portfolio Analysis      Finance         BC-400-10                     
    1400        2010 Q4 Portfolio Analysis      Finance         BC-500-10                     
    1400        2010 Q4 Portfolio Analysis      Finance         BC-800-10                     
    1400        2010 Q4 Portfolio Analysis      Finance         BC-200-10                     
    1400        2010 Q4 Portfolio Analysis      Finance         BC-700-10                     
    1400        2010 Q4 Portfolio Analysis      Finance         BC-600-10   
    

    我需要得到这个结果

    enter image description here

    我尝试使用联接:

    SELECT P.ProjectID, P.ProjectName, P.Department, D.BudgetCode
    FROM DEPARTMENT D
    RIGHT JOIN PROJECT P ON P.ProjectID = D.DepartmentName
    

    但我得到一个转换错误

    将varchar值“Accounting”转换为数据类型int时,转换失败。

    我认为这是因为不可能将varchar转换为int。除非强制转换可以工作。。。

    SELECT P.ProjectID, P.ProjectName, P.Department, D.BudgetCode
    FROM DEPARTMENT D
    RIGHT JOIN PROJECT P ON cast(P.ProjectID AS varchar) = D.DepartmentName
    

    使用石膏,我得到了这个结果

    ProjectID   ProjectName                     Department      BudgetCode
    1000        2010 Q3 Product Plan            Marketing       NULL
    1100        2010 Q3 Portfolio Analysis      Finance         NULL
    1200        2010 Q3 Tax Preparation         Accounting      NULL
    1300        2010 Q4 Product Plan            Marketing       NULL
    1400        2010 Q4 Portfolio Analysis      Finance         NULL
    

    这几乎就是我想要的,但它为我的预算代码显示了空值,这是不正确的。它们不是空值。

    所以在这一点上,我没有主意了。 (顺便说一句,我知道在我的数据库中有一个varchar作为主键,我正试图将该主键与一个int主键连接起来。如果它们是同一类型的,我相信我的连接会起作用)

    1 回复  |  直到 6 年前
        1
  •  1
  •   iSR5    6 年前

    If项目。部门是部门的关键。DepartmentName然后你就可以加入了。

    JOIN Project P ON P.Department = D.DepartmentName
    

    如果没有,则需要查看Project和Department两个表之间共享的列,并通过该列链接这两个表。共享列需要在两个表上具有相同的数据类型。

    另一个提示是,您正在查询部门并加入项目,同时,您只使用来自部门的预算代码,其余的来自项目。在这种情况下,您需要查询项目并加入部门。

    SELECT 
        P.ProjectID, 
        P.ProjectName, 
        P.Department, 
        D.BudgetCode
    FROM PROJECT P
    INNER JOIN DEPARTMENT D ON D.DepartmentName = P.Department