3

我今天遇到了另一个开发人员使用 SQL Server 查询设计器工具生成的这个可怕的怪异 SQL 查询。 我讨厌查询设计器,但我一直试图弄清楚它做了什么。 我以前从未见过这样的语法,也不理解它。它是如何工作的?

特别是多个 ON 子句连接在一起,与 JOIN 子句分开,这让我失望。

SELECT *
FROM  dbo.tblDealStatus
    RIGHT OUTER JOIN dbo.tblUser
            RIGHT OUTER JOIN dbo.tblOwnerLocation
                     INNER JOIN dbo.tblOwner
                          INNER JOIN dbo.tblDeal
                           ON dbo.tblOwner.OwnerID = dbo.tblDeal.OwnerID
                      ON dbo.tblOwnerLocation.DealID = dbo.tblDeal.DealID
             ON dbo.tblUser.UserID = dbo.tblDeal.CHK_Contact
            LEFT OUTER JOIN dbo.tblCompany AS tblCompany_1
                    INNER JOIN dbo.tblParticipation
                     ON tblCompany_1.CompanyID = dbo.tblParticipation.CompanyID
             ON dbo.tblDeal.ParticipationID = dbo.tblParticipation.ParticipationID
     ON /*...
      ....so on and so forth...*/
4

1 回答 1

3

首先,为了清楚起见,我规定永远不要在同一个查询中混合右连接和左连接。所有右连接都可以切换到左连接,仅此一项就可以更容易地弄清楚发生了什么。

下一个放弃选择 *. 在连接查询中永远不合适,因为您在两个或多个字段(连接字段)中返回相同的数据,这会浪费宝贵的网络和数据库处理时间。

我相信奇怪的 ON 迫使查询按特定顺序进行。它们很糟糕,我认为不应该使用它们,因为它们很难维护,开发人员也很难理解,因为它们并不常见并且完全不需要。只需反转正确的连接并将表按您需要连接它们的顺序放置即可解决此问题。如果不是,您可能需要一些派生表来获取正确的数据。请注意,在反转它时,您可能需要将这些内部连接更改为其他内容。现在它是如此混乱,它很可能不会返回正确的结果。因此,在重写它时,虽然您希望查看您的更改是否会更改结果,但您还希望使用判断来确定更改是针对错误查询的修复还是错误更改以将查询转换为可维护的内容。

如果写这个烂摊子的开发人员还在,我会强迫他用更标准的 SQL 重写,并告诉他禁止再次使用查询设计器。就我而言,这无法通过代码审查。

如果我正在重写它,我会查找应该在查询中首先出现的表并从那里开始工作。我个人现在的猜测是它将是 tblDeal 表,但我不知道您的数据模型,所以我可能是错的。

于 2013-04-05T21:34:27.457 回答