I have 3 tables products, pricingGroup and productPricing. I want to show all products even it has no service pricing and set its status/IsActive to false.
What query I have now
x
SELECT product.productId,
products.ProductCode,
product.ProductDetails,
product.ProductDescription,
(CASE WHEN prgrp.pricingGroupId IS NOT NULL && product.IsActive = 1 THEN 1
ELSE 0 END) IsActive,
prgrp.PricingName,
pricing.amount
FROM Products product
LEFT OUTER JOIN productPricing AS pricing ON product.productId = pricing.productId OR pricing.productId IS NULLL
LEFT OUTER JOIN pricingGroup as prgrp on true
What I want to Get
ProductId ProductCode ProductDetails ProductDescrition IsActive PricingGroupName Amount
1 PRCD1 detail1 Descrition1 1 MERCHANT 20
1 PRCD1 detail1 Descrition1 0 Consumer 20
1 PRCD1 detail1 Descrition1 0 OTHERS 20
2 PRCD2 detail2 Descrition2 1 Consumer 25
2 PRCD2 detail2 Descrition2 0 MERCHANT 25
2 PRCD2 detail2 Descrition2 0 OTHERS 25
3 PRCD3 detail3 Descrition3 0 Consumer 0
3 PRCD3 detail3 Descrition3 0 MERCHANT 0
3 PRCD3 detail3 Descrition3 0 OTHERS 0
Products Table
ProductId ProductCode ProductDetails ProductDescrition IsActive
1 PRCD1 detail1 Descrition1 1
2 PRCD2 detail2 Descrition2 1
3 PRCD3 detail3 Descrition3 0
ProductPricing Table
ProductPricingId PricingGroup ProductId Amount Fee
1 1 1 20 5
2 1 2 25 5
PricingGroup Table
PricingGroupId PricingName
1 Merchant
2 Consumer
3 Others
Advertisement
Answer
- You are missing last join clause
pricing.PricingGroup = prgrp.PricingGroupId
. - You don’t need
OR products.productId IS NULL
because that is primary key ofProducts
table and will not be null.
SELECT product.ProductId,
product.ProductCode,
product.ProductDetails,
product.ProductDescription,
IF(pricing.ProductId = product.ProductId && product.IsActive = 1, 1, 0) IsActive,
prgrp.PricingName,
pricing.amount
FROM Products product
JOIN pricingGroup as prgrp
LEFT JOIN productPricing AS pricing ON pricing.PricingGroup = prgrp.PricingGroupId && pricing.productId = product.productId;