Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
DavidChel
Constraint Violating Yak Guru
474 Posts |
Posted - 2009-03-18 : 10:05:56
|
Please consider the following query which does work: SELECT dbo.somast.[fcompany], dbo.somast.[fcustno], dbo.somast.[forderdate], sorels.fsono, dbo.somast.[fsorev], dbo.somast.[fcustpono], sorels.identity_column, sorels.fsono, sorels.fenumber, sorels.frelease, coalesce (InMast.fOnHand, 0) AS [On Hand], (SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake) AS shipped, sorels.finvqty, sorels.forderqty, COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 ) AS SHIPPEDNOTINVOICED, (SORELS.forderqty - SORELS.finvqty - COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 )) * SORELS.funetprice AS NewFNBOAMT, (SELECT TOP 1 poitem.fpono FROM POITEM_EXT INNER JOIN poitem ON poitem.identity_column = poitem_ext.fkey_id WHERE ltrim (rtrim (sorels.fsono)) = ltrim (rtrim (poitem_ext.SALESORDERNO))) AS [PO Num] FROM SORELS JOIN SOMAST ON SOMAST.FSONO = SORELS.FSONO JOIN SOITEM ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER LEFT OUTER JOIN inmast InMast ON (SORels.fPartNo = InMast.fPartNo) AND (SORels.fpartRev = InMast.fRev) WHERE SOMAST.FSTATUS = 'OPEN' AND FMASTERREL = 0 AND somast.forderdate >= CONVERT (DATETIME, '01/01/2002') It works, but is slower than molasses because it is scanning each record in the main query against the sub query. When I try to following it runs quickly and I don't get an error, but I receive all Nulls for P.salesorderno. SELECT dbo.somast.[fcompany], dbo.somast.[fcustno], dbo.somast.[forderdate], sorels.fsono, dbo.somast.[fsorev], dbo.somast.[fcustpono], sorels.identity_column, sorels.fsono, sorels.fenumber, sorels.frelease, coalesce (InMast.fOnHand, 0) AS [On Hand], (SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake) AS shipped, sorels.finvqty, sorels.forderqty, COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 ) AS SHIPPEDNOTINVOICED, (SORELS.forderqty - SORELS.finvqty - COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 )) * SORELS.funetprice AS NewFNBOAMT, P.FPONO FROM SORELS JOIN SOMAST ON SOMAST.FSONO = SORELS.FSONO JOIN SOITEM ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER LEFT OUTER JOIN inmast InMast ON (SORels.fPartNo = InMast.fPartNo) AND (SORels.fpartRev = InMast.fRev) LEFT OUTER JOIN (SELECT TOP 1 poitem.fpono, poitem_ext.salesorderno FROM POITEM_EXT INNER JOIN poitem ON poitem.identity_column = poitem_ext.fkey_id WHERE len (poitem_ext.salesorderno) = 6) P ON ltrim (rtrim (sorels.fsono)) = ltrim (rtrim (P.SALESORDERNO)) WHERE SOMAST.FSTATUS = 'OPEN' AND FMASTERREL = 0 AND somast.forderdate >= CONVERT (DATETIME, '01/01/2002') Can anyone tell me why? |
|
|
sakets_2000
Master Smack Fu Yak Hacker
1472 Posts |
Posted - 2009-03-18 : 10:18:43
|
In your 2nd query where you have, (SELECT TOP 1......(P.SALESORDERNO)) data set is just one row. Thats not the same as your first query. |
 |
|
|
sakets_2000
Master Smack Fu Yak Hacker
1472 Posts |
Posted - 2009-03-18 : 10:22:50
|
| In your first query, you are scanning for top 1 match on fpono from poitem for every fsono in Sorels table. In your second query, you are taking top 1 fpono match between POITEM_EXT and poitem and matching the same value against every record in Sorels table. You'll see a lot of nulls because of this. |
 |
|
|
DavidChel
Constraint Violating Yak Guru
474 Posts |
Posted - 2009-03-18 : 10:40:23
|
Well, the problem is that the relationship between poitem_ext.salesorderno and sorels.fsono is not 1 to 1. I simply want to return the first record which corresponds. I tried this, and it's closer to what I need: SELECT dbo.somast.[fcompany], dbo.somast.[fcustno], dbo.somast.[forderdate], sorels.fsono, dbo.somast.[fsorev], dbo.somast.[fcustpono], sorels.identity_column, sorels.fsono, sorels.fenumber, sorels.frelease, coalesce (InMast.fOnHand, 0) AS [On Hand], (SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake) AS shipped, sorels.finvqty, sorels.forderqty, COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 ) AS SHIPPEDNOTINVOICED, (SORELS.forderqty - SORELS.finvqty - COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 )) * SORELS.funetprice AS NewFNBOAMT, P.FPONO FROM SORELS JOIN SOMAST ON SOMAST.FSONO = SORELS.FSONO JOIN SOITEM ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER LEFT OUTER JOIN inmast InMast ON (SORels.fPartNo = InMast.fPartNo) AND (SORels.fpartRev = InMast.fRev) LEFT OUTER JOIN (SELECT distinct poitem.fpono, poitem_ext.salesorderno FROM POITEM_EXT INNER JOIN poitem ON poitem.identity_column = poitem_ext.fkey_id WHERE len (poitem_ext.salesorderno) = 6) P ON ltrim (rtrim (sorels.fsono)) = ltrim (rtrim (P.SALESORDERNO)) WHERE SOMAST.FSTATUS = 'OPEN' AND FMASTERREL = 0 AND somast.forderdate >= CONVERT (DATETIME, '01/01/2002') However, I still end up with "extra" records. Any ideas? |
 |
|
|
DavidChel
Constraint Violating Yak Guru
474 Posts |
Posted - 2009-03-18 : 10:41:27
|
| Oh! What about grouping the subquery and taking the top 1? I'm going to give that a try. |
 |
|
|
DavidChel
Constraint Violating Yak Guru
474 Posts |
Posted - 2009-03-18 : 10:49:20
|
When I try this: SELECT dbo.somast.[fcompany], dbo.somast.[fcustno], dbo.somast.[forderdate], sorels.fsono, dbo.somast.[fsorev], dbo.somast.[fcustpono], sorels.identity_column, sorels.fsono, sorels.fenumber, sorels.frelease, coalesce (InMast.fOnHand, 0) AS [On Hand], (SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake) AS shipped, sorels.finvqty, sorels.forderqty, COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 ) AS SHIPPEDNOTINVOICED, (SORELS.forderqty - SORELS.finvqty - COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 )) * SORELS.funetprice AS NewFNBOAMT, P.FPONO FROM SORELS JOIN SOMAST ON SOMAST.FSONO = SORELS.FSONO JOIN SOITEM ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER LEFT OUTER JOIN inmast InMast ON (SORels.fPartNo = InMast.fPartNo) AND (SORels.fpartRev = InMast.fRev) LEFT OUTER JOIN (SELECT poitem.fpono, max(poitem_ext.salesorderno) FROM POITEM_EXT INNER JOIN poitem ON poitem.identity_column = poitem_ext.fkey_id WHERE len (poitem_ext.salesorderno) = 6 group by poitem.fpono) P ON ltrim (rtrim (sorels.fsono)) = ltrim (rtrim (P.SALESORDERNO)) WHERE SOMAST.FSTATUS = 'OPEN' AND FMASTERREL = 0 AND somast.forderdate >= CONVERT (DATETIME, '01/01/2002') I get the following error: Error 3/18/2009 9:47:22 AM 0:00:00.046 SQL Server Database Error: No column was specified for column 2 of 'P'. 2 0 |
 |
|
|
sakets_2000
Master Smack Fu Yak Hacker
1472 Posts |
Posted - 2009-03-18 : 11:07:05
|
this should be ok,,SELECT dbo.somast.[fcompany], dbo.somast.[fcustno], dbo.somast.[forderdate], sorels.fsono, dbo.somast.[fsorev], dbo.somast.[fcustpono], sorels.identity_column, sorels.fsono, sorels.fenumber, sorels.frelease, coalesce (InMast.fOnHand, 0) AS [On Hand], (SORELS.fshipbook + SORELS.fshipbuy + sorels.fshipmake) AS shipped, sorels.finvqty, sorels.forderqty, COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 ) AS SHIPPEDNOTINVOICED, (SORELS.forderqty - SORELS.finvqty - COALESCE (DBO.GETSHIPPEDNOTINVOICEDQTY( sorels.fsono + sorels.finumber + sorels.frelease), 0 )) * SORELS.funetprice AS NewFNBOAMT, P.FPONO FROM SORELS JOIN SOMAST ON SOMAST.FSONO = SORELS.FSONO JOIN SOITEM ON SOITEM.FSONO = SORELS.FSONO AND SOITEM.FINUMBER = SORELS.FINUMBER LEFT OUTER JOIN inmast InMast ON (SORels.fPartNo = InMast.fPartNo) AND (SORels.fpartRev = InMast.fRev) LEFT OUTER JOIN (SELECT poitem.fpono,SALESORDERNO= max(poitem_ext.salesorderno) FROM POITEM_EXT INNER JOIN poitem ON poitem.identity_column = poitem_ext.fkey_id WHERE len (poitem_ext.salesorderno) = 6 group by poitem.fpono) P ON ltrim (rtrim (sorels.fsono)) = ltrim (rtrim (P.SALESORDERNO)) WHERE SOMAST.FSTATUS = 'OPEN' AND FMASTERREL = 0 AND somast.forderdate >= CONVERT (DATETIME, '01/01/2002') |
 |
|
|
DavidChel
Constraint Violating Yak Guru
474 Posts |
Posted - 2009-03-18 : 11:07:39
|
Ha. Cool, thanks sakets. |
 |
|
|
sakets_2000
Master Smack Fu Yak Hacker
1472 Posts |
Posted - 2009-03-18 : 11:34:07
|
| np |
 |
|
|
|
|
|
|
|