Question

I am connecting to a NetSuite database via ODBC and created a rather large query for the database to run a report. 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. 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. 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)
Was it helpful?

Solution

You should consider using JOIN for each table instead of using WHERE clauses to link them. If both tables need to contain the same "Id", then use 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. Any field from TableB without a match will show up as NULL.

You can nest all the JOIN claues. I'm not sure how netsuite handles things, but you may need to put () around the join clauses.

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top