Ahoi,
i have a subquery that my predecessor made and i honestly don't understand why it produces the result it does.
The query is excluding certain user defined combinations which are not relevant. My problem is it filters something it should not filter in my opinion
SELECT b.SlpCode,b.Country_code
FROM [DSA].[FACT_B1_UMS] as a left outer join
dsa.MD_B1_Kunde as b on a.[U_GUE_CardCode] = b.CardCode
and a.Country_code = b.Country_code
where not (a.U_GUE_CardCode in ('10507','10787') and a.Country_Code = 'TR1')
and not (a.U_GUE_SlpCode = '18' and a.Country_code = 'FR1')
and not (b.SlpCode = '18' and b.Country_code = 'FR1')
and not (a.U_GUE_CardCode in ('20011') and a.Country_code = 'TR2')
and not (a.U_GUE_ItemCode = ' ' and a.Country_code = 'SE1')
and not (b.SlpCode in ('-1','4','6') and b.Country_code = 'BE1')
and not (a.U_GUE_SlpCode in ('-1','4','6') and a.Country_code = 'BE1')
and not (a.U_GUE_CardCode in ('9981500') and a.Country_code = 'JP1')
and not (a.U_GUE_CardCode = '1' and a.Country_code = 'ES1')
Now the issue i encounter is the following, there was a value missing for a.U_GUE_DocNum = '910016396'
So i was trying to find the reason why it is not working and found the where lines which were responsible for the rows to be missing.
It is the following (commented).
SELECT b.SlpCode,b.Country_code
FROM [DSA].[FACT_B1_UMS] as a left outer join
dsa.MD_B1_Kunde as b on a.[U_GUE_CardCode] = b.CardCode
and a.Country_code = b.Country_code
where not (a.U_GUE_CardCode in ('10507','10787') and a.Country_Code = 'TR1')
and not (a.U_GUE_SlpCode = '18' and a.Country_code = 'FR1')
--and not (b.SlpCode = '18' and b.Country_code = 'FR1')
and not (a.U_GUE_CardCode in ('20011') and a.Country_code = 'TR2')
and not (a.U_GUE_ItemCode = ' ' and a.Country_code = 'SE1')
--and not (b.SlpCode in ('-1','4','6') and b.Country_code = 'BE1')
---
and not (a.U_GUE_SlpCode in ('-1','4','6') and a.Country_code = 'BE1')
and not (a.U_GUE_CardCode in ('9981500') and a.Country_code = 'JP1')
and not (a.U_GUE_CardCode = '1' and a.Country_code = 'ES1')
and a.U_GUE_DocNum = '910016396'
What i dont understand is: the checks in these two lines both refere both to the same column in the same table, but the results without these 2 lines are all NULL.
Why do these 2 lines that are commented in the exclude the rows i am looking for although the value is not does not check for NULL.
EDIT: one of the 2 "and not" is enough for all of the rows to be excluded
I want to be the very best
Like no one ever was
November 27, 2019 at 9:18 am
I may be missing the point but...
I notice that your addition to the WHERE clause just targets the left table. You are LEFT OUTER JOINing to the right table, but then only returning columns from the right table. If this is indeed a subquery it does not make sense to me.
Is it possible that it is matching rows from the left table where no match to the right table exists, which is causing the data returned to be NULL?
FUCK MY LIFE
I want to be the very best
Like no one ever was
November 27, 2019 at 10:45 am
Just remember NULL does not evaluate - but try and avoid doing ISNULL(myfield,'')
you end up checking for blank spaces and NULL everywhere.
I've found that default values can help SQL a lot - even if you have to put a value that is "unspecified"
a typical scenario is "gender" - (i'll simplify by not using transgender) - but you can choose male, female or leave it blank - I default to 0 (unspecified) or let them choose 1 or 2 (M/F)
it really avoids ugly queries where null is involved
MVDBA
November 27, 2019 at 3:28 pm
He is right that NULL doesn't evaluate to TRUE, which might be part of your problem. I think the larger problem is the way your JOIN is set up. I'm guessing a little bit here, but the LEFT JOIN looks like an odd choice, given that you don't want anything from the "a" table; you are just filtering by it. Maybe try something more like this below.
SELECT b.SlpCode,b.Country_code
FROM dsa.MD_B1_Kunde as b
WHERE NOT (b.SlpCode = '18' and b.Country_code = 'FR1')
AND NOT (b.SlpCode in ('-1','4','6') and b.Country_code = 'BE1')
AND (b.Country_code NOT IN(a.U_GUE_CardCode in ('10507','10787') and a.Country_Code = 'TR1')
AND NOT (
SELECT a.Country_code
FROM [DSA].[FACT_B1_UMS] a
WHERE (a.U_GUE_SlpCode = '18' and a.Country_code = 'FR1')
or (a.U_GUE_CardCode in ('20011') and a.Country_code = 'TR2')
or (a.U_GUE_ItemCode = ' ' and a.Country_code = 'SE1')
or (a.U_GUE_SlpCode in ('-1','4','6') and a.Country_code = 'BE1')
or (a.U_GUE_CardCode in ('9981500') and a.Country_code = 'JP1')
or (a.U_GUE_CardCode = '1' and a.Country_code = 'ES1')
)
Steven Henderson
The SQL Guy
November 28, 2019 at 2:02 pm
Those of us who follow ISO standards use 0=unknown, 1= male, 2= female, 9= lawful person (churches, corporations, etc.) And make the column not null.
Please post DDL and follow ANSI/ISO standards when asking for help.
November 28, 2019 at 2:22 pm
Those of us who follow ISO standards use 0=unknown, 1= male, 2= female, 9= lawful person (churches, corporations, etc.) And make the column not null.
do you have a link to that ISO standard? it might be interesting reading - especially since there are so many new categories of things we collect data about - sexuality, gender, etc
MVDBA
November 28, 2019 at 7:43 pm
https://en.wikipedia.org/wiki/ISO/IEC_5218
Please post DDL and follow ANSI/ISO standards when asking for help.
November 29, 2019 at 9:06 am
well I've been accidentally getting it correct for the last 20 years
MVDBA
Viewing 10 posts - 1 through 9 (of 9 total)
You must be logged in to reply to this topic. Login to reply