如何实现具有多个连接条件的SQL Server查询
我正在尝试实现这个查询,但是我不明白为什么没有得到结果 以下是描述: 假设我有一个table调用:如何实现具有多个连接条件的SQL Server查询,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我正在尝试实现这个查询,但是我不明白为什么没有得到结果 以下是描述: 假设我有一个table调用:TableAct Acct# Date WithdrawAmt DepositAmt !24455 2012-11-19-00.00.00 1245.77 200.50 125577 2011-02-12-00.00.00 100.98 578.00 另一个表表Custo
TableAct
Acct# Date WithdrawAmt DepositAmt
!24455 2012-11-19-00.00.00 1245.77 200.50
125577 2011-02-12-00.00.00 100.98 578.00
另一个表表CustomerOrd
:
ID# COrder# CustID Ord_Description VendorType
124455 7712AS 123 1AAA Permanent
125577 9914DL 346 1BBB Partial
... UK1234 111 2HJ5 Permanent'
,,, FR0912 567 5LGY Partial
然后TableCustomerDtls
:
CustID Descriptions Delivery Address ZipCode
123 1AAA_BLUESHARE SUCCESSFUL 222 Main St 97002
346 1BBB_CHASE DECLINE 40 West Side 97122
111 2HJ5_CITIBANK SUCCESSFUL ……. …….
567 5LGY_VANGURD DECLINED ---- -----
和表交付航班
:
FlightOrder# FlightCustID FlightDt
7712AS 123 2011-9-29-00.00.00
9914DL 346 2010-11-2-00.00.00
UK1234 111 2012-4-1-00.00.00
FR0912 567 2012-9-11-00.00.00
我想在以下条件下更新TableAct
:
TableAct。Acct#=TableCustomerOrd.ID#
、和
:TableCustomerOrd。CustID=TableCustomerDtls.CustID
同时,TableCustomerOrd.Ord\u说明
字段应与TableCustomerDtls匹配。说明
字段之前的任何内容。因此'1AAA',2HJ5'
等和
:
deliveryflight.FlightOrder#=TableCustomerOrd.COrder#
,和
:deliveryflight.FlightCustID=TableCustomerOrd。客户ID
。还有TableCustomerDtls。交付=‘成功’
和:
DelivaryFlight.FlightOrder# = TableCustomerOrd. COrder#
AND DelivaryFlight.FlightCustID = TableCustomerOrd. CustID
Also TableCustomerDtls. Delivery = ‘DECLINED
elivaryFlight.FlightDt>deliveryflight.FlightDt
基本上,我需要将表deliveryflight
列FlightOrder#,FlightCustID
与TableCustomerOrd
匹配
此外,TableCustomerDtls
columnDelivery
tock
用于Delivery
状态,如“拒绝”
和'SUCCESSFUL'
条件,并将'SUCCESSFUL'FlightDt
与'declient'FlightDt
进行比较
这是我的疑问,但请帮助我理解,我相信这可以以更好的方式完成
查询不起作用:
Update
Set …
FROM TableAct AC
Join TableCustomerOrd CustOd
ON AC.Acct# = CustOd.ID#
Join TableCustomerDtls CDtls
ON CDtls. CustID = CustOd. CustID
AND (CustOd.Ord_Descriptions =
Left(CDtls.Descriptions, LEN(rtrim(CDtls.Descriptions))))
JOIN DelivaryFlight DF
ON DF.FlightOrder# = CustOd.COrder#
AND DF.FlightCustID = CustOd.CustID
AND CDtls.Delivery = ‘SUCCESSFUL’
JOIN DelivaryFlight DF2
ON DF2.FlightOrder# = DF.COrder#
AND DF2.FlightCustID = DF.CustID
AND CDtls.Delivery = ‘DECLINED’
WHERE DelivaryFlight. FlightDt > DelivaryFlight. FlightDt
AND DepositAmt > 100
你的帮助将是巨大的,因为我的项目将在本周结束。
谢谢
如果我有这样一个复杂的查询,我首先创建一个“简单”选择,它只生成要更新的行 它还应该返回更新表的更新值和主键 然后(相对地)直接(内部)将其与要更新的表连接起来,并执行更新重新绑定,通过包括
WHERE tblTobeUpdated.pk = SimpleSelect.pk
希望这有帮助我没有时间深入研究这一点,但我怀疑您至少想解决以下问题:
WHERE DelivaryFlight. FlightDt > DelivaryFlight. FlightDt
这是一个永远无法满足的条件
您可能想要:
WHERE DF. FlightDt > DF2. FlightDt
对于这些复杂的问题,更新能够看到将要更新的记录也很有用,因此我通常会这样做:
Update
Set …
--Select *
FROM TableAct AC
然后,我不运行更新,而是运行高亮显示并运行以select开头的部分以查看结果,在我确定选择了要选择的记录并且要替换的值正确之前,不测试更新。尝试分解查询,这是我今天编写的查询,分别测试每个部件
SELECT
Employee
, Reference
, Payroll
, [Hours] / 60
[Hours]
, [Days]
FROM
(
SELECT
Employee
, Reference
, Payroll
, SUM( Duration ) AS [Hours]
, AvailableID
FROM
(
SELECT
RequirerID
, Duration
, RTRIM( COALESCE(MA.MemberLastName, '')
+ ' ' + COALESCE(MA.MemberFirstName, '')
+ ' ' + COALESCE(MA.MemberInitial, '')) Employee
, COALESCE(MA.Detailref1, '') Reference
, COALESCE(MA.PayrollRef, '') Payroll
, Available.AvailableId
FROM
(
SELECT DISTINCT
RequirerID
, ShiftDate
, CAST(ShiftStart - ShiftEnd - ShiftBreak AS DECIMAL(19,2)) ShiftDuration
, Id RequirementRecordID
FROM
Requirements
WHERE
Requirements.ShiftDate BETWEEN @ParamStartDate
AND @ParamEndDate
AND RequirerID IN (SELECT ID FROM MemberDetails WHERE CompanyID = @ParamCompanyID)
)
R
INNER JOIN
ShiftConfirmed
INNER JOIN
Available
INNER JOIN
MemberDetails MA
ON Available.AvailableID = MA.ID
ON ShiftConfirmed.AvailableRecordID = Available.ID
ON R.RequirementRecordID = ShiftConfirmed.RequirementRecordID
WHERE
R.ShiftDate BETWEEN @ParamStartDate
AND @ParamEndDate
AND COALESCE(ShiftChecked, 0) BETWEEN 0 AND 1
)
ShiftDay
Group By
Employee
, Reference
, Payroll
, AvailableId
) Shifts
INNER JOIN
(
SELECT
COUNT( * ) AS [Days]
, AvailableID
FROM
(
SELECT DISTINCT
R.ShiftDate
, Available.AvailableId
FROM
(
SELECT DISTINCT
ShiftDate
, Id RequirementRecordID
FROM
Requirements
WHERE
Requirements.ShiftDate BETWEEN @ParamStartDate
AND @ParamEndDate
AND RequirerID IN (SELECT ID FROM MemberDetails WHERE CompanyID = @ParamCompanyID)
)
R
INNER JOIN
ShiftConfirmed
INNER JOIN
Available
INNER JOIN
MemberDetails MA
ON Available.AvailableID = MA.ID
ON ShiftConfirmed.AvailableRecordID = Available.ID
ON R.RequirementRecordID = ShiftConfirmed.RequirementRecordID
WHERE
R.ShiftDate BETWEEN @ParamStartDate
AND @ParamEndDate
AND COALESCE(ShiftChecked, 0) BETWEEN 0 AND 1
)
ShiftDay
Group By
AvailableId
) D
ON Shifts.AvailableID = D.AvailableID
WHERE [Hours] > 0
ORDER BY
Employee
我真的不明白:
WHERE deliveryflight。FlightDt>DeliveryFlight。FlightDt
不要在字段名中使用#,几乎总是最好避免在字段名中使用符号。在#的情况下,如果您碰巧使用它作为第一个字符,SQl server会认为您有一个临时表而不是字段名。请拼写正确。这是一种会让维护程序员发疯的事情,所以最好从一开始就养成更好的习惯。Beth谢谢,是的,这些是输入错误,谢谢你们所有人,但这是我的查询,这些是输入错误。我想你们需要分解查询,逐个测试加入和条件。你看起来好像在使用子查询,我见过的最清楚的例子是我们没有你的数据。这里所有其他的指导都是好的,但它是学习解决问题的一部分,你可以开发出解决问题的技术。我倾向于将我的查询编写为参数化的查询,其中go后跟exec myquery params作为“在线”测试,然后在SSMS中按f5将运行和测试集于一身。Ian,谢谢,请查看上面的所有表格,此查询需要匹配DF.FlightOrder#=CustOd.COrder#和DF.FlightCustID=CustOd.CustID和TableCustomerDtls.Delivery='SUCCESSFUL',不仅需要匹配DF2.FlightOrder#=DF.COrder#和DF.FlightCustID=DF.CustID和TableCustomerDtls.Delivery='defeed',所以我正在进行分离加入DeliveryFlight表上的条件。我还有其他方法可以实现它吗?这是一个好的选择吗?此外,请帮助我使这个查询工作。大家好,请帮助我解决这个查询…非常感谢您可以嵌套您的查询:我将作为一个响应,因为它很难在注释中编写代码谢谢,但请您解释更多细节。