Cross compare from within the same table.

  • I have a list of items with a substitute and a Y/N box to determine that they are old items. (Code to follow.)
    A10 has a sub of B10 and B10 is old. B10 is subbed back to A10, but A10 is marked N as being old.
    A10 also has a sub of C10. The catch is that C10 is not subbed back to A10, but is subbed to B10.
    Here is how the table looks. Question is, How do I find the sub items tagged with a Y, then compare their sub to see if it was the parent item?
    data:image/png;base64,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
    I want to look at the first row and see B10 has a Y, now look and make sure B10 has a sub back to A10 (row 2)(don't care about the Y/N). Row 3, A10 has a sub of C10 which is Y, but C10 does not sub back to A10 at all. I need to know this. I'm thinking a LOOP but I'm not too good at that, or a nested query??
    CREATE TABLE jec_sub (item varchar(40), sub varchar(40), old varchar(1))
    INSERT INTO jec_sub (item, sub, old)
    VALUES ('A10', 'B10', 'Y'),
    ('B10', 'A10', 'N'),
    ('A10', 'C10', 'Y'),
    ('C10', 'B10', 'Y')
    SELECT * FROM jec_sub

  • A loop is definitely not necessary (and will perform badly to boot).  Have you tried the sub-query?  My first thought was a LEFT OUTER JOIN.  See if you can figure it out with those hints.

    Drew

    J. Drew Allen
    Business Intelligence Analyst
    Philadelphia, PA

  • Is this close to what you are looking for? EXISTS can be useful for this kind of comparison.


    SELECT jec_olds.*
    FROM jec_sub AS jec_olds
    WHERE EXISTS (
       SELECT 1 FROM jec_sub AS subs_back
       WHERE subs_back.item = jec_olds.sub
       AND subs_back.sub = jec_olds.item
    )
    AND jec_olds.old = 'Y'

  • Not 100 percent sure what you're trying to do but if you join the table back to itself then you can identify the substitutes that are "Y" for old and where the sub item substitute is the same as the original item.


    SELECT *
    FROM
        jec_sub
        LEFT JOIN jec_sub tSub ON jec_sub.sub = tsub.item
    WHERE
        tsub.old = 'Y'
        AND tsub.sub = dbo.jec_sub.item

  • All of these are close, but maybe I didn't explain it correctly. I have a main item and it's substitute. The sub can also be  a main item with a sub listed for it. The Y/N box is just for interchangeable and is only for reporting. I need to look at the main and sub items and make sure they are linked both ways.

    1. A is an item and has a sub of B and the inter box checked
    2. B is an item and has a sub of A
    CREATE TABLE jec_main_sub (main varchar(5), sub varchar(5), inter varchar(1))
    INSERT INTO jec_main_sub (main, sub, inter)
    VALUES ('A', 'B', 'Y'),
    ('B', 'A', NULL),
    ('F', 'R', NULL),
    ('D', 'Q', 'Y'),
    ('Q','X', NULL)

    A and B are cross subbed but when B is the main item, the inter box is not checked.
    There's not a sub from R back to F but the inter box is not checked (so I don't even need to see this).
    D has a sub of Q and the inter box is Y, but Q is not linked back to D. (so I don't even need to see this).
    All I care about is that A to B is checked and that there is a B to A so I need to see if it is checked.

    I just need to report the matching items which are cross referenced only and also note if the inter box is checked or not.

  • I'm still not 100% sure of your rules, but hopefully if needed you can adjust this to get what you need:


    SELECT
        jec.main, jec.sub,
        'cross sub entry found, but the inter box is not checked' AS message
    FROM dbo.jec_main_sub jec
    INNER JOIN dbo.jec_main_sub jec_cross_sub ON
        jec_cross_sub.main = jec.sub AND
        jec_cross_sub.sub = jec.main
    WHERE jec.inter = 'Y' AND
         (jec_cross_sub.inter IS NULL OR jec_cross_sub.inter = 'N')
    ORDER BY main, sub

    SQL DBA,SQL Server MVP(07, 08, 09) A socialist is someone who will give you the shirt off *someone else's* back.

  • Sounded like you wanted to know the inter column value of the second set, regardless of value.

    SELECT    jms.main, jms.sub, jms.inter, jms2.main, jms2.sub, jms2.inter
    FROM    jec_main_sub AS jms
    INNER JOIN jec_main_sub AS jms2
    ON        jms.sub = jms2.main
    AND        jms.main = jms2.sub
    WHERE    jms.inter = 'Y'
    ;

    This also assumes you are not looking for multi-level connections.  I.e. ('M', 'N', 'Y'), ('N', 'O', NULL), ('O', 'M', NULL)

  • I think I can take it from here. All of these are very helpful, now just to move them into a CTE so I can expand the report. Thank you all.

Viewing 8 posts - 1 through 7 (of 7 total)

You must be logged in to reply to this topic. Login to reply