• Here's how you should lay out your sample data: -

    CREATE TABLE Customer (CustomerID INT, CustomerName VARCHAR(200), Birthdate DATETIME);

    INSERT INTO Customer

    SELECT CustomerID,CustomerName,Birthdate

    FROM (VALUES(1,'John Doe','1/1/1970 08:31 AM'),(2,'Jane Doe','1/1/1971 01:18 PM'),

    (3,'Jon Public','1/1/1972 11:58 PM'),(4,'Jane Public','1/1/1973 07:00 AM'),

    (5,'John Smith','1/1/1974 08:31 AM'))a(CustomerID,CustomerName,Birthdate);

    CREATE TABLE [Order] (OrderID INT, [PO Number] VARCHAR(10), OrderDate DATETIME);

    INSERT INTO [Order]

    SELECT OrderID, [PO Number], OrderDate

    FROM (VALUES(1000,'ABC123','1/1/2012 01:00 PM'),(2000,'112233','2/1/2012 02:00 AM'),

    (3000,'XYZ987','3/1/2012 03:00 PM'),(4000,'50000','4/1/2012 04:00 AM'),

    (5000,'Verbal','5/1/2012 05:00 AM'))a(OrderID, [PO Number], OrderDate);

    CREATE TABLE CustomerOrders (CustomerID INT, OrderID INT, IsShipped VARCHAR(5));

    INSERT INTO CustomerOrders

    SELECT CustomerID, OrderID, IsShipped

    FROM (VALUES(1,1000,'False'),(1,3000,'True'),(3,4000,'False'),(2,2000,'True'),

    (5,5000,'True'))a(CustomerID, OrderID, IsShipped);

    That makes it so that anyone can just execute the script and have a mock-up of your data. You should include any indexes as well if you want the best performing solution.

    Jeff's method is fine, but to show another method you could also do this: -

    SELECT *

    FROM Customer cus

    WHERE NOT EXISTS (SELECT 1

    FROM CustomerOrders ord

    WHERE cus.CustomerID = ord.CustomerID);

    They probably perform the same, but it's worth testing both methods on your actual data.


    Forever trying to learn
    My blog - http://www.cadavre.co.uk/
    For better, quicker answers on T-SQL questions, click on the following...http://www.sqlservercentral.com/articles/Best+Practices/61537/
    For better, quicker answers on SQL Server performance related questions, click on the following...http://www.sqlservercentral.com/articles/SQLServerCentral/66909/