【问题标题】:Join two tables together with the use of a third table that contains composite keys from both?将两个表连接在一起并使用包含来自两者的复合键的第三个表?
【发布时间】:2021-10-07 21:15:41
【问题描述】:

我正在尝试将两个表与第三个表组合在一起,第三个表由一个列组成,该列是两个表主键列的组合。我考虑过使用子字符串将列分成可以与任一表的键列进行比较的部分,但我可能会使其变得更加困难。

【问题讨论】:

  • 有什么问题?如何修复数据模型?
  • 看起来问题是您的联结表有 1 列带有分隔值,而它应该有 2 列,它们被正确定义为外键。

标签: sql sql-server tsql ssms


【解决方案1】:

您可以将 join 与 LIKE 运算符一起使用。 第一张桌子是这样的:

combinedcode LIKE '%' + purchasecode

第二个

combinedcode LIKE receiptcode + '%'

虽然这段代码的性能可能不太好。如果可以的话,你应该改变你的数据模型

【讨论】:

    【解决方案2】:

    这里的问题是你的设计;你需要修复它。您在连接表中的列 combinedcode 中存储了一个分隔值。

    您应该做的是将 2 个值存储在单独的列中,然后在这些值上创建外键。这看起来像这样:

    CREATE TABLE dbo.Table1 (SomeID varchar(10) NOT NULL,
                             SomeValue varchar(20));
    ALTER TABLE dbo.Table1 ADD CONSTRAINT PK_Table1 PRIMARY KEY (SomeID);
    GO
    CREATE TABLE dbo.Table2 (OtherID varchar(10) NOT NULL,
                             OtherValue varchar(20));
    ALTER TABLE dbo.Table2 ADD CONSTRAINT PK_Table2 PRIMARY KEY (OtherID);
    GO
    CREATE TABLE dbo.JunctionTable (SomeID varchar(10) NOT NULL,
                                    OtherID varchar(10) NOT NULL);
    ALTER TABLE dbo.JunctionTable ADD CONSTRAINT FK_JunctionTable1 FOREIGN KEY (SomeID) REFERENCES dbo.Table1(SomeID);
    ALTER TABLE dbo.JunctionTable ADD CONSTRAINT FK_JunctionTable2 FOREIGN KEY (OtherID) REFERENCES dbo.Table2(OtherID);
    

    根据您的设计,您可能希望连接表中的值是唯一的:

    ALTER TABLE dbo.JunctionTable ADD CONSTRAINT PK_JunctionTable PRIMARY KEY (SomeID,OtherID);
    

    那么,做你的JOINs 就这么简单:

    SELECT {Your Columns}
    FROM dbo.Table1 T1
         JOIN dbo.JunctionTable JT ON T1.SomeID = JT.SomeID
         JOIN dbo.Table2 T2 ON JT.OtherID = T2.OtherID;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多