2

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

假设我有两张桌子,Products并且Services. 我想做这样的查询:

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

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

到目前为止,我发现的另一种方法是区分每个字段,Products除了IdService一个。但是这样我每次添加新字段时都必须更新查询Products

有一个更好的方法吗?

4

8 回答 8

13

您不应该在生产代码中使用 SELECT * (嗯,几乎没有,但是可以很容易地计算出合理的时间)。

于 2009-05-18T14:09:39.297 回答
12

最常见的 SQL 反模式有哪些?

您遇到了反模式 #1。

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

sp_help tablename

如果您想从此查询创建视图 - 使用 select * 会给您带来更多麻烦。SQL Server 在创建视图时捕获列列表。如果您编辑基础表并且不重新创建视图-您正在注册麻烦(我遇到了这种性质的生产火灾-尽管视图针对的是不同数据库中的表)。

于 2009-05-18T14:11:48.747 回答
3

据我所知,你必须避免SELECT *,但这并不是一个真正的问题。

SELECT *通常被视为等待发生的问题,因为您引用的原因是优势!通常,当数据库被修改时,查询出现的额外结果列会导致问题。

于 2009-05-18T14:10:38.343 回答
1

您的 SQL 方言是否支持 COMPOSE?COMPOSE 摆脱了在等值连接上使用的列的额外副本,就像您的示例中的那样。

于 2009-05-18T14:10:25.707 回答
1

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

于 2009-05-18T14:14:04.063 回答
1

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

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
于 2009-05-18T14:22:17.713 回答
0

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

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

于 2009-05-18T14:18:35.257 回答
0

最好的方法是从查询中指定您想要的确切字段。*无论如何你都不应该使用。

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

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

指定确切的输出需要做更多的工作,但从长远来看,它通常会得到回报。当您进行更改时,只有您实际更改的内容会受到影响,您不会得到破坏您甚至不知道受到影响的代码的级联效果。

于 2009-05-18T14:18:53.803 回答