SQL让我很头疼 - 多个连接

时间:2010-11-30 17:08:50

标签: c# asp.net sql

首先,我将解释我的情景。这是使用中的两个通用表:

账户:

  

LegacyID =标识符   帐户

     

InvoiceAccount =帐户可以拥有   多个子帐户在同一个   表。该字段是LegacyID   其父帐户

     

客户=可以有两种不同   帐户类型,他们可以分享   ID's - 所以此专栏区分   2.为了我的目的   SQL我总是希望它是真的   比假

     

AllocatedUser =的用户名   需要看到这个的人   交付。这只是填充   父帐户,所以我需要链接   返回获取子帐户

交货:

  

LegacyID =交货标识

     

Customer =帐户的LegacyID   与交货有关(可以是   子帐户)

     

OnHold =用于此目的的旗帜   我的查询需要是'true'

现在已经解释过,基本上我需要一个SQL来返回任何“OnHold”的交付,但仅用于分配登录用户的帐户的交付。如果交付链接到父帐户的选择AllocatedUser的查询很简单,但如果交付链接到子帐户,我遇到了返回行的问题 - 它根本就不返回任何内容。这是下面的SQL:

SELECT     Deliveries_1.LegacyID, Deliveries_1.TripDate, Deliveries_1.OnHoldReason, Account_2.AllocatedUser
FROM         Deliveries AS Deliveries_1 INNER JOIN
                      Account AS Account_1 ON Deliveries_1.Customer = Account_1.InvoiceAccount INNER JOIN
                      Account AS Account_2 ON Account_1.InvoiceAccount = Account_2.LegacyID
WHERE     (Deliveries_1.OnHold = @OnHold) AND (Account_2.Customer = 'True') AND (Account_2.AllocatedUser = @AllocatedUser)

我的思绪因试图弄清楚为什么它现在不起作用而感到疲惫 - 我真的很感激任何建议。

谢谢!

3 个答案:

答案 0 :(得分:2)

听起来您在Deliveries表中查找与用户帐户,用户的直接父母帐户以及用户的直接子帐户相关联的记录。如果这是真的修改您的查询,如下所示应该做的伎俩。

SELECT DISTINCT d.LegacyID, d.TripDate, d.OnHoldReason,
       case
          when child.LegacyID = d.Customer then child.AllocatedUser
          when parent.LegacyID = d.Customer then parent.AllocatedUser
          else this.AllocatedUser
       end as 'Delivery_AllocatedUser'
FROM Account this
  LEFT JOIN Account parent on parent.LegacyID = this.InvoiceAccount
  LEFT JOIN Account child on this.LegacyID = child.InvoiceAccount
  JOIN Deliveries d on (d.Customer = this.LegacyID AND this.Customer = 'True')
                    OR (d.Customer = parent.LegacyID AND parent.Customer = 'True')
                    OR (d.Customer = child.LegacyID AND child.Customer = 'True')
WHERE d.OnHold = @OnHold
  AND this.AllocatedUser = @AllocatedUser

答案 1 :(得分:0)

首先要注意的是,如果遇到问题,应该按步骤构建连接。

第二条评论是,在您发布的查询中存在不必要的连接 - 您不会过滤,也不会选择也不会将表格别名中的任何内容加入Account_1

也许这表明你做错了什么。否则,查询看起来(!)ok(假设所有连接都是正确的;您的描述不准确 - 例如对于Accounts.Customer,您说'为了我的SQL的目的,我总是希望它是真的而不是假的' - 客户不是真/假是真的吗?你是什么意思?还有其他这样的不一致......)

一些样本数据和结果样本可以提供更多的亮点。

答案 2 :(得分:0)

 ON Deliveries_1.Customer = Account_1.InvoiceAccount
 ON Account_1.InvoiceAccount = Account_2.LegacyID 

如果这两个条件都为真,那么Delivery.Customer将等于Account2.LegacyId(交付必须在父帐户上)。我认为这不是你想要的。

也许你的意思是

 ON Deliveries_1.Customer = Account_1.LegacyID
 ON Account_1.InvoiceAccount = Account_2.LegacyID