Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何实现具有多个连接条件的SQL Server查询_Sql_Sql Server 2008_Tsql - Fatal编程技术网

如何实现具有多个连接条件的SQL Server查询

如何实现具有多个连接条件的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

我正在尝试实现这个查询,但是我不明白为什么没有得到结果

以下是描述:

假设我有一个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
另一个表
表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
    column
    Delivery
    to
    ck
    用于
    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表上的条件。我还有其他方法可以实现它吗?这是一个好的选择吗?此外,请帮助我使这个查询工作。大家好,请帮助我解决这个查询…非常感谢您可以嵌套您的查询:我将作为一个响应,因为它很难在注释中编写代码谢谢,但请您解释更多细节。