首先,我将解释我的情景。这是使用中的两个通用表:
账户:
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)
我的思绪因试图弄清楚为什么它现在不起作用而感到疲惫 - 我真的很感激任何建议。
谢谢!
答案 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