Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MSSQL query with UNION and ORDER BY is mal-constructed #921

Open
derekm opened this issue Oct 19, 2023 · 0 comments
Open

MSSQL query with UNION and ORDER BY is mal-constructed #921

derekm opened this issue Oct 19, 2023 · 0 comments

Comments

@derekm
Copy link

derekm commented Oct 19, 2023

I have this rather large routine:

requestedOrdersForTemp := bunDB.NewSelect().
	ColumnExpr("o.orderid, o.customerid, eo.shiftnum").
	TableExpr("orders o").
	Join("LEFT JOIN tempRequestedShifts trs ON trs.orderID = o.orderid").
	Join("JOIN enrichedOrders eo ON o.orderID = eo.orderid").
	Where("(tempID = ? OR (o.filledby = ? AND o.status_ca = 'Filled (Unconfirmed)'))", params.TempID, params.TempID).
	Where("o.shiftendtime >= CAST(CAST(GETDATE() AS datetimeoffset) AT TIME ZONE 'US Eastern Standard Time' AS datetime)").
	Where("jobdatestart = ?", params.Date).
	Where("(isRejected = 0 OR (isRejected IS NULL AND o.status_ca = 'Filled (Unconfirmed)'))")
query := bunDB.NewSelect().
	With("requestedOrdersForTemp", requestedOrdersForTemp).
	ColumnExpr("o.orderid").
	ColumnExpr("o.customerid").
	TableExpr("orders o").
	Join("JOIN enrichedOrders eo ON o.orderid = eo.orderid").
	Where("jobdatestart = ?", params.Date).
	Where("o.shiftendtime >= CAST(CAST(GETDATE() AS datetimeoffset) AT TIME ZONE 'US Eastern Standard Time' AS datetime)").
	Where("o.status = 'open'").
	Where("eo.shiftnum NOT IN (SELECT shiftnum FROM requestedOrdersForTemp)").
	Union(bunDB.NewSelect().ColumnExpr("orderid, customerid").TableExpr("requestedOrdersForTemp"))
if params.TempID != 0 {
	addTempRelatedPredicates(params.TempID, query)
}
addFacilityRelatedPredicates(facilitiesByDistance, params.FacilityID, query)
addCommonPredicates(params.GetShiftsCommon, query)
query.OrderExpr("shiftstarttime")

Expected result is:

WITH
"requestedOrdersForTemp" AS (
    SELECT o.orderid, o.customerid, eo.shiftnum, o.shiftstarttime
    FROM orders o
    LEFT JOIN tempRequestedShifts trs ON trs.orderID = o.orderid 
    JOIN enrichedOrders eo ON o.orderID = eo.orderid 
    WHERE ((tempID = 4 OR (o.filledby = 4 AND o.status_ca = 'Filled (Unconfirmed)'))) 
    AND (o.shiftendtime >= CAST(CAST(GETDATE() AS datetimeoffset) AT TIME ZONE 'US Eastern Standard Time' AS datetime)) 
    AND (jobdatestart = N'2023-10-20') 
    AND ((isRejected = 0 OR (isRejected IS NULL AND o.status_ca = 'Filled (Unconfirmed)')))
)
SELECT o.orderid, o.customerid, eo.shiftnum, o.shiftstarttime
FROM orders o 
JOIN enrichedOrders eo ON o.orderid = eo.orderid 
WHERE (jobdatestart = N'2023-10-20') 
AND (o.shiftendtime >= CAST(CAST(GETDATE() AS datetimeoffset) AT TIME ZONE 'US Eastern Standard Time' AS datetime)) 
AND (o.status = 'open') 
AND (eo.shiftnum NOT IN (SELECT shiftnum FROM requestedOrdersForTemp)) 
AND (o.specialty IN (
    SELECT value FROM profile_temp CROSS APPLY STRING_SPLIT(Specialty, ',') WHERE (recordid = 4)
)) 
AND (o.nursetype IN (
    SELECT value FROM profile_temp CROSS APPLY STRING_SPLIT(Certification, ',') WHERE (recordid = 4)
))
AND (o.customerid NOT IN (
    SELECT FacilityID FROM facilities WHERE (FacilityDNR IS NOT NULL) AND (TempID = 4)
))
UNION
SELECT orderid, customerid, shiftnum, shiftstarttime FROM requestedOrdersForTemp
ORDER BY shiftstarttime

But what I get from Bun is invalid outer parens surrounding the two queries and incorrect placement of ORDER BY (should come after the two queries):

(
WITH "requestedOrdersForTemp" AS (
    SELECT o.orderid, o.customerid, eo.shiftnum 
    FROM orders o 
    LEFT JOIN tempRequestedShifts trs ON trs.orderID = o.orderid 
    JOIN enrichedOrders eo ON o.orderID = eo.orderid 
    WHERE ((tempID = 4 OR (o.filledby = 4 AND o.status_ca = 'Filled (Unconfirmed)'))) 
    AND (o.shiftendtime \u003e= CAST(CAST(GETDATE() AS datetimeoffset) AT TIME ZONE 'US Eastern Standard Time' AS datetime)) 
    AND (jobdatestart = N'2023-10-20') 
    AND ((isRejected = 0 OR (isRejected IS NULL AND o.status_ca = 'Filled (Unconfirmed)'))
)) 
SELECT o.orderid, o.customerid 
FROM orders o 
JOIN enrichedOrders eo ON o.orderid = eo.orderid 
WHERE (jobdatestart = N'2023-10-20') 
AND (o.shiftendtime \u003e= CAST(CAST(GETDATE() AS datetimeoffset) AT TIME ZONE 'US Eastern Standard Time' AS datetime)) 
AND (o.status = 'open') 
AND (eo.shiftnum NOT IN (
SELECT shiftnum FROM requestedOrdersForTemp)) 
AND (specialty IN (SELECT value FROM profile_temp CROSS APPLY STRING_SPLIT(Specialty, ',') WHERE (recordid = 4))) 
AND (nursetype IN (SELECT value FROM profile_temp CROSS APPLY STRING_SPLIT(Certification, ',') WHERE (recordid = 4))) 
AND (customerid NOT IN (SELECT FacilityID FROM facilities WHERE (FacilityDNR IS NOT NULL) 
AND (TempID = 4))) 
ORDER BY shiftstarttime
) 
UNION
(
SELECT orderid, customerid FROM requestedOrdersForTemp
)
@derekm derekm changed the title Complex MSSQL query is mal-constructed MSSQL query with UNION and ORDER BY is mal-constructed Oct 23, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant