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

如何处理多个一->多个关系?

  •  0
  • niczak  · 技术社区  · 17 年前

    如果只有一个发布类型(所以只有一个表有1->多个),那么使用嵌套连接很容易实现,比如:

    SELECT * FROM articles 
      INNER JOIN status ON articles.spubid = status.spubid 
      INNER JOIN people ON articles.spubid = people.spubid 
      WHERE people.saffil = 'ABC' ORDER BY people.iorder, articles.spubid;
    

    5 回复  |  直到 17 年前
        1
  •  2
  •   John Hyland    17 年前

    为什么他们在不同的桌子上?这些柱子有那么不同吗?您想返回哪些列(在生产环境中永远不要使用select*,尤其是在连接时),它们在查询中的不同类型之间是否不同?

    如果你能让列保持一致,我建议你使用UNION ALL。即使列不同,在联合语句的每个部分提供所需的所有内容(为表集没有的列提供null值),你仍然可以得到你想要的。简化代码如下:

    SELECT articlename, articlestatus, author, ISBN_Number 
    FROM articles 
      INNER JOIN status ON articles.spubid = status.spubid   
      INNER JOIN people ON articles.spubid = people.spubid   
    WHERE people.saffil = 'ABC' 
    UNION ALL 
    SELECT papername, paperstatus, author, null
    FROM papers 
      INNER JOIN status ON papers.spubid = status.spubid   
      INNER JOIN people ON papers.spubid = people.spubid   
    WHERE people.saffil = 'ABC' 
    
        2
  •  2
  •   HLGEM    17 年前

    您可以创建一个视图,该视图是所有不同表的联合。棘手的一点是确保所有被UNIONed的查询都有相同的字段,所以你需要在每个查询中添加一些存根。以下是一个仅包含两个表的简化示例:

    CREATE VIEW AllTables AS
      SELECT Afield1, Afield2, NULL as Bfield1, NULL as Bfield2 FROM Atable
        UNION
      SELECT NULL as Afield1, NULL as Afield2, Bfield1, Bfield2 FROM Btable;
    

    "'magazine' AS publication_type" 或与您的每个选择类似的东西)。

        3
  •  0
  •   p.campbell    17 年前

    也许您可以为5种类型(vwBook、vwArticle等)中的每一种创建视图

    当然,可以根据需要进行修改。以下是一个宽泛的中风示例:

    create proc MySearch
    
    @MySearchTerm varchar(50)
    
    AS
        DECLARE @SearchResultsTABLE
        (
         Type      varchar(10) -- the view you found the result in.
        ,ID        int -- the primary key of the Book record. whatever you want to link it back to the original
        ,FoundText varchar(512)
        --etc
        )
    
        INSERT INTO @SearchResults(Type, ID, FoundText)
          SELECT 'Articles', ID, SomeKeyField
          FROM vwArticle
          WHERE SomeKeyField LIKE '%' + @MySearchTerm + '%'
    
        INSERT INTO @SearchResults(Type, ID, FoundText)
          SELECT 'Book', ID, SomeKeyField
          FROM vwBook
          WHERE SomeKeyField LIKE '%' + @MySearchTerm + '%'
    
        --repeat as needed with the 3 other views that you'd build
    
        SELECT * FROM @SearchResults
    
        4
  •  0
  •   A. L. Flanagan    17 年前

    我真的不喜欢这里的桌子设计。然而,我认为从头开始重新设计整个数据库有点过于极端。

    考虑到表的设计,我认为你必须使用UNION并指定每个表中的列。我知道这是一个怪物,但当你设计的表中有很多“几乎”相似的列时,就会发生这种情况。

    HLGEM是对的。在永久存储的查询中使用“select*”确实很危险。

        5
  •  0
  •   niczak    17 年前

    推荐文章