3

I need help with a SQL query. My problem is better explained with some examples.

Say I have my data like this pulling from two tables, ORDR and RDRO. The first table (ORDR) contains all the data about the order except for the items. The second table (RDRO) contains all the item information for an order. Both tables can be joined using [docNum].

T0.docNum | T1.itemCode
123         EDS100
123         DDS200
123         DDS500

124         LLS220
124         LDS254

125         FGD450
125         LDS552
125         DDS200 
125         EDD200

I want to return all rows when 1 item number meets the criteria.

Say in this case I want all the rows of the order when one row is equal to DDS200 would give this result:

T0.docNum | T1.itemCode
123         EDS100
123         DDS200    -- match
123         DDS500

125         FGD450
125         LDS552
125         DDS200    -- match
125         EDD200

I'm sure this is trivial, I have tried the following:

SELECT T0.docNum, T1.itemCode 
FROM ordr T0  INNER JOIN rdro T1 ON T0.docNum = T1.docNum 
WHERE  T1.itemCode like 'DDS200';

this only returns the rows that meet the criteria, not all the rows of the order as shown above.

Also, please note I'm on SQL server.

Thanks for your help

5
  • 2
    I was going to answer this, but in a comment on an existing answer you convoluted the question by saying that there are two tables. Show your join SQL, and show the definitions of the two tables. As it is unclear what you are asking based on that comment.
    – Bob G
    Commented Nov 22, 2017 at 18:48
  • 1
    I somehow doubt that you have a table named order. Commented Nov 22, 2017 at 19:15
  • @Nicolas I don't see why you need the join. Seems like items have both columns (doc and item). Unless doc is different than doc#... In any case, you can easily adjust the queries provided with your table and column names. Commented Nov 22, 2017 at 19:21
  • Please update the question to properly show your table structure and which columns are in which table. So far you've called the doc# column three different things and I have no idea if item# is in both tables. If you can't abstract your real table and column names in a logical and consistent way, please just use your actual table and column names. Commented Nov 22, 2017 at 19:53
  • @AaronBertrand I have updated my post. Let me know if clear enough. Thanks for your patience.
    – Nicolas
    Commented Nov 22, 2017 at 20:24

1 Answer 1

7

There are a few ways that you can achieve this...

You can use a subquery to return the docNum of the rows that match the criteria from RDRO and then use an outer query to get the rest; like so:

SELECT r.docNum, r.itemCode
  FROM (SELECT DISTINCT docNum
          FROM rdro
         WHERE itemCode = 'DDS200') AS a
  JOIN rdro AS r
    ON r.docNum = a.docNum;

Or, as pointed out by Aaron, you can also use a WHERE EXISTS to achieve the same result:

SELECT r.docNum, r.itemCode
  FROM rdro as r
 WHERE EXISTS (
         SELECT * 
           FROM rdro 
          WHERE docNum = r.docNum 
            AND itemCode = 'DDS200');

Or you can use a WHERE...IN:

SELECT r.docNum, r.itemCode
  FROM rdro as r
 WHERE r.docNum IN (
         SELECT docNum
           FROM rdro 
          WHERE itemCode = 'DDS200');

Or you could even do it straight in the JOIN:

SELECT r.docNum, r.itemCode
  FROM rdro as r
  JOIN rdro AS o
    ON r.docNum = o.docNum
   AND o.itemCode = 'DDS200';

Heck, for completeness lets even throw in a CTE version:

 WITH docs
 AS
 (SELECT docNum FROM RDRO WHERE itemCode = 'DDS200')
  SELECT r.docNum, r.itemCode
    FROM RDRO AS r
    JOIN docs AS d
      ON r.docNum = d.docNum;

Try each one and review the execution plans that are generated for them before choosing which one to go for. Normally if two query plans are the same I choose the query that is easier to maintain.

Example of execution and results can be found on sqlfiddle.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.