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

“从内部联接表中选择*”

  •  2
  • djeidot  · 技术社区  · 15 年前

    如何选择两个联接表的所有字段,而不与公共字段冲突?

    假设我有两张桌子, Products Services . 我想进行如下查询:

    SELECT Products.*, Services.* 
    FROM Products 
    INNER JOIN Services ON Products.IdService = Services.IdService
    

    这个查询的问题是 IdService 会出现两次并导致一系列问题。

    到目前为止,我发现的另一种选择是将每个领域与 产品 除了 IdService 一个。但是这样,每次添加新字段到 产品 .

    有更好的方法吗?

    8 回复  |  直到 15 年前
        1
  •  12
  •   Community CDub    7 年前

    What are the most common SQL anti-patterns?

    你已经击中反模式1。

    更好的方法是提供字段列表。获取快速字段列表的一种方法是

    sp_help tablename
    

    如果你想从这个查询中创建一个视图,使用select*会给你带来更多的麻烦。SQL Server在创建视图时捕获列列表。如果您编辑底层表,而不重新创建视图——您注册时遇到了麻烦(我遇到了这种性质的生产问题——视图是针对不同数据库中的表的)。

        2
  •  13
  •   erikkallen    15 年前

    您不应该在生产代码中选择“*”(好吧,几乎不应该选择“*”,但是它被证明是合理的时间可以很容易地计算出来)。

        3
  •  3
  •   David Webb    15 年前

    据我所知,你必须避免 SELECT * 但这不是问题。

    选择* 通常被认为是一个等待发生的问题,因为你的报价是一个优势!通常,当数据库被修改时,为查询显示额外的结果列会导致问题。

        4
  •  1
  •   Walter Mitty    15 年前

    您的SQL方言支持撰写吗?compose去掉了在equijoin上使用的列的额外副本,就像示例中的那个一样。

        5
  •  1
  •   CSharpAtl    15 年前

    正如其他人所说,select*是一个坏消息,特别是如果将其他字段添加到要查询的表中。您应该从表中选择所需的确切字段,并且可以对具有相同名称的字段使用别名,也可以只使用table.columnname。

        6
  •  1
  •   Dmitri Kouminov    15 年前

    不要使用*。使用这样的东西:

    SELECT P.field1 AS 'Field from P'
         , P.field2
         , S.field1 AS 'Field from S'
         , S.field4 
      FROM Products P
           INNER JOIN 
           Services S
           ON P.IdService = S.IdService
    
        7
  •  0
  •   HLGEM    15 年前

    这是正确的,列出您想要的字段(在SQL Server中,您可以从对象浏览器中将它们拖动过来,这样就不必全部键入)。顺便说一下,如果您的特定查询不需要某些字段,请不要列出它们。这会给服务器带来额外的工作,并消耗额外的网络资源,当您的系统运行一天数千次时,这可能是导致性能不佳的原因之一。

    至于它是一个维护问题,如果使用查询的应用程序部分会受到这些字段的影响,那么您只需要添加这些字段。如果您不知道新字段会有什么影响,或者需要在哪里添加它,则不应该添加该字段。另外,通过使用select*意外地添加新文件也会导致维护问题。创建性能问题以避免进行维护(您可能根本不需要进行维护,因为列更改应该很少(如果不需要查看您的设计),这是非常短视的。

        8
  •  0
  •   Guffa    15 年前

    最好的方法是指定查询中所需的确切字段。你不应该使用 * 不管怎样。

    使用方便 * 获取所有字段,但它不会生成健壮的代码。表中的任何更改都将更改从查询返回的结果,这并不总是可取的。

    您应该只返回查询中您真正想要的数据,并按照您想要的确切顺序进行指定。这样,即使向表中添加字段或更改表中字段的顺序,结果看起来也完全相同。

    详细说明确切的输出是一点工作量,但从长远来看,它通常是有回报的。当您进行更改时,只有您实际更改的内容会受到影响,您不会得到破坏您甚至不知道受到影响的代码的级联效果。