Say I have sqlite table with the following records:
recID | productID | productName |
---|---|---|
1 | 1 | Product A |
2 | 2 | Product B |
3 | 2 | Product C |
4 | 3 | Product D |
5 | 3 | Product D |
recID = primary key, auto increment.
If I run: SELECT productID, productName FROM table GROUP BY productID, productName
Result is:
productID | productName |
---|---|
1 | Product A |
2 | Product B |
2 | Product C |
3 | Product D |
As you can see, productID 2 has inconsistent productName: Product B and Product C
. How do I run query just to detect the inconsistent ones? Eg I want the result to be:
productID | productName |
---|---|
2 | Product B |
2 | Product C |
CodePudding user response:
Use EXISTS
to get a productID
with more than 1 productName
s:
SELECT t1.productID, t1.productName
FROM tablename t1
WHERE EXISTS (
SELECT *
FROM tablename t2
WHERE t2.productID = t1.productID AND t2.productName <> t1.productName
);
Or, for a small dataset use aggregation in a subquery which counts the distinct number of productName
s of each productID
, with the operator IN
:
SELECT productID, productName
FROM tablename
WHERE productID IN (
SELECT productID
FROM tablename
GROUP BY productID
HAVING COUNT(DISTINCT productName) > 1
);
CodePudding user response:
We can try to use COUNT
window function to compare grouping productID, productName
is one and grouping productID
higher than one.
Query #1
SELECT productID, productName
FROM (
SELECT *,
COUNT(*) OVER(PARTITION BY productID, productName) cnt1,
COUNT(*) OVER(PARTITION BY productID) cnt2
FROM T
) t1
WHERE cnt1 = 1 AND cnt2 > 1;
productID | productName |
---|---|
2 | Product B |
2 | Product C |