skip to Main Content

Below is the query which finds the matching record and returns those "main"."item"."id" which matches the values inside IN clause.

select main.item_vendor.item_id
from main.item_vendor
join main.item on item.id = main.item_vendor.item_id
WHERE "main"."item"."id" IN ('188646', '200000699')

Above query returns only one value which has record for 188646 and for other it is missing. Now I need to use above query and INSERT values in main.item_vendor table just for this 200000699.

How can I plugin below INSERT query into above join query so that it can insert only for those which doesn’t exist. Meaning I want to insert in main.item_vendor table only for 200000699 item id since it doesn’t exist.

INSERT INTO "main"."item_vendor" ("item_id", "vendor_id", audit_by, currency_id )
VALUES (200000699, ?, ?, ?);

3

Answers


  1. with wNotExists as (
      select main.item.id as notExistsId
        from main.item_vendor
        right join main.item on main.item.id = main.item_vendor.item_id
        where main.item_vendor.item_id is null
          and main.item.id IN ('188646', '200000699') -- comment this line for getting all "id" from "item" not exists in "item_vendor"
    )
    insert into main.item_vendor (item_id, vendor_id, audit_by, currency_id)
      select notExistsId, ?, ?, ?
        from wNotExists;
    
    Login or Signup to reply.
  2. You can use a CTE to determinen the item id and the insert iof the item_id doesn’t exist

    WITH CTE  as (
    select item_vendor.item_id
    from item_vendor
    join item on item.id = item_vendor.item_id
    WHERE "main"."item"."id" IN ('188646', '200000699'))
    INSERT INTO "item_vendor" ("item_id", "vendor_id", audit_by, currency_id )
    SELECT (item_id, 1, 1, 1)
    FROM CTE c1
      WHERE NOT EXISTS ( SELECT 1 FROM item_vendor WHERE item_id = c1.item_id)
    
    Login or Signup to reply.
  3. There is no need for you to check if an id already exists. Put a unique index on item_id or make it the primary key. Postgres will automatically check if the value already exists. If you do nothing else the condition throws an exception, but you can alter this by extending the insert to contain the on conflict clause. You can then either update the existing values or to just ignore (silently) the offending incoming row. So for this case:

    insert into "main"."item_vendor" ("item_id", "vendor_id", audit_by, currency_id )
         values ('188646', ?, ?, ?),('200000699', ?, ?, ?)
      on conflict (item_id) 
      do nothing;  
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search