简体   繁体   English

ODBC连接中的多个JOIN问题

[英]Issue with multiple JOINs in ODBC connection

I am connecting to a NetSuite database via ODBC and created a rather large query for the database to run a report. 我通过ODBC连接到NetSuite数据库,并为数据库创建了一个相当大的查询来运行报告。 I've placed the code at the end of this post. 我把代码放在这篇文章的末尾。 My problem is, the query is excluding rows from the "A_T_PROJECTS" table that have NULL in the "TRADING_PARTNER_ID" field. 我的问题是,查询排​​除了“A_P_PROJECTS”表中“TRADING_PARTNER_ID”字段中具有NULL的行。 I know I could use a RIGHT OUTER JOIN here, but I can't seem to get it to work due to the fact that I am joining several other tables. 我知道我可以在这里使用RIGHT OUTER JOIN,但由于我正在加入其他几个表,我似乎无法使它工作。 Any suggestions on what I can try? 关于我可以尝试的任何建议?

The connection is read-only, so no temporary tables - and I'd like this to work in a single query. 连接是只读的,因此没有临时表 - 我希望这可以在单个查询中工作。 Thanks for your time! 谢谢你的时间!

SELECT
    [A_T_CUSTOMERS].[COMPANYNAME] AS [Company Name],
    [A_T_MILESTONES].[PROJECT_MILESTONE_NAME] AS [Name],
    [A_T_PROJECTS].[COMPANYNAME] AS [Project Name],
    [A_T_STATUS].[LIST_ITEM_NAME] AS [Status],
    [A_T_MILESTONES].[DUE_DATE] AS [Milestone Due],
    [A_T_ACTIONREQ].[LIST_ITEM_NAME] AS [Action Required By],
    [A_T_PARTNERS].[COMPANYNAME] AS [Trading Partner],
    [A_T_EMPLOYEES].[FULL_NAME] AS [Assigned To],
    [A_T_CUSTOMERS].[ESTIMATED_DELIVERY_DATE] AS [Est Del Date],
    CASE
            WHEN [A_T_MILESTONES].[PROJECT_MILESTONE_NAME] = 'Project Complete/Move to Production'
                    THEN [A_T_MILESTONES].[DUE_DATE]
            ELSE NULL
    END AS [Est Move to Prod]

FROM
    [CUSTOMERS] AS [A_T_CUSTOMERS],
    [CUSTOMERS] AS [A_T_PROJECTS],
    [PROJECT_MILESTONE] AS [A_T_MILESTONES],
    [PARTNERS] AS [A_T_PARTNERS],
    [STATUS] AS [A_T_STATUS],
    [ACTION_REQUIRED] AS [A_T_ACTIONREQ],
    [EMPLOYEES] AS [A_T_EMPLOYEES]
    --RIGHT OUTER JOIN [PARTNERS] ON ([A_T_PARTNERS].[PARTNER_ID] = [A_T_PROJECTS].[TRADING_PARTNER_ID])

WHERE
    -- JOIN CLAUSES --
    [A_T_PROJECTS].[CUSTOMER_ID] = [A_T_MILESTONES].[PROJECT_NAME_ID]
    AND [A_T_CUSTOMERS].[CUSTOMER_ID] = [A_T_MILESTONES].[CUSTOMER_MILESTONE_NAME_ID]
    AND [A_T_PARTNERS].[PARTNER_ID] = [A_T_PROJECTS].[TRADING_PARTNER_ID]
    AND [A_T_EMPLOYEES].[EMPLOYEE_ID] = [A_T_MILESTONES].[ASSIGNED_TO_ID]
    AND [A_T_STATUS].[LIST_ID] = [A_T_MILESTONES].[STATUS_ID]
    AND [A_T_ACTIONREQ].[LIST_ID] = [A_T_MILESTONES].[ACTION_REQUIRED_BY_ID]

    -- FILTER CLAUSES --
    AND [A_T_CUSTOMERS].[CUSTOMER_SINCE] > '2011-12-10 00:00:00'
    AND ([A_T_MILESTONES].[STATUS_ID] = 1
            OR [A_T_MILESTONES].[STATUS_ID] = 2
            OR [A_T_MILESTONES].[STATUS_ID] = 3
            OR [A_T_MILESTONES].[STATUS_ID] = 5)
    AND ([A_T_PROJECTS].[STATUS] = 'Assigned'
            OR [A_T_PROJECTS].[STATUS] = 'Delayed - per Customer'
            OR [A_T_PROJECTS].[STATUS] = 'Delayed - per Internal'
            OR [A_T_PROJECTS].[STATUS] = 'Delayed - per TP/VAN'
            OR [A_T_PROJECTS].[STATUS] = 'In Progress'
            OR [A_T_PROJECTS].[STATUS] = 'Production'
            OR [A_T_PROJECTS].[STATUS] = 'On-Hold')
    AND [A_T_CUSTOMERS].[TRANSLATOR_ID] != 4
    AND [A_T_CUSTOMERS].[IN_PRODUCTION] = 'F'
    AND ([A_T_PROJECTS].[JOB_TYPE_ID] IS NOT NULL
            OR [A_T_PROJECTS].[JOB_TYPE_ID] != 8
            OR [A_T_PROJECTS].[JOB_TYPE_ID] != 11)

You should consider using JOIN for each table instead of using WHERE clauses to link them. 您应该考虑为每个表使用JOIN ,而不是使用WHERE子句来链接它们。 If both tables need to contain the same "Id", then use TableA INNER JOIN TableB ON TableA.Id=TableB.Id . 如果两个表都需要包含相同的“Id”,则使用TableA INNER JOIN TableB ON TableA.Id=TableB.Id If you want all the TableA records even if some are missing in TableB, use the TableA LEFT JOIN TableB ON TableA.Id=TableB.Id . 如果您想要所有TableA记录,即使TableB中缺少某些记录,也请使用TableA LEFT JOIN TableB ON TableA.Id=TableB.Id Any field from TableB without a match will show up as NULL . TableB中没有匹配项的任何字段都将显示为NULL

You can nest all the JOIN claues. 您可以嵌套所有JOIN条目。 I'm not sure how netsuite handles things, but you may need to put () around the join clauses. 我不确定netsuite如何处理事情,但你可能需要在join子句中放置()

FROM (TableA AS A INNER JOIN TableB AS B ON A.id=B.id)
                  LEFT JOIN TableC AS C ON A.id=C.id

Good luck. 祝好运。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM