Subject | Re: [firebird-support] Doubt (Problem) In Writing SQL |
---|---|
Author | Vishal Tiwari |
Post date | 2017-07-17T11:16:21Z |
Hi SET,
Thank You for the reply. Not an issue, I could understand.
Before I execute this SQL, would like to learn something pretty interesting logic in the SQL you provided.
I got the intention of using Exists predicate but I couldn't understand the logic behind the below condition, would you please help me in understanding?
AND ( BSD.BOOK_NO < BSD2.BOOK_NO
OR ( BSD.BOOK_NO = BSD2.BOOK_NO
AND BSD.BOOK_ID < BSD2.BOOK_ID ) ) )
OR ( BSD.BOOK_NO = BSD2.BOOK_NO
AND BSD.BOOK_ID < BSD2.BOOK_ID ) ) )
Thanking You Master Trouble Shooter And With Best Regards.
Vishal
On Saturday, 8 July 2017 10:59 PM, "setysvar setysvar@... [firebird-support]" <firebird-support@yahoogroups.com> wrote:
Den 05.07.2017 20:15, skrev Vishal
Tiwari vishualsoft@... [firebird-support]:
Hi SET,Hi Vishal!
Just for you my Friend... Please check...
CREATE TABLE BOOK_SELLING_DETAIL(BOOK_NO Integer,BOOK_ID Integer,PUBLISHER Varchar(50),MAIN_BRACH Varchar(10),PUBLISH_DATE Date,ORIGINAL_PRICE Float,SELLING_PRICE Float);
INSERT INTO BOOK_SELLING_DETAIL (BOOK_NO, BOOK_ID, PUBLISHER, MAIN_BRACH, PUBLISH_DATE, ORIGINAL_PRICE, SELLING_PRICE, "DB_KEY") VALUES ('5', '222', 'Willy', 'Branch1', '25.01.2010', '550.000000', '500.000000', '00000086:00000001');INSERT INTO BOOK_SELLING_DETAIL (BOOK_NO, BOOK_ID, PUBLISHER, MAIN_BRACH, PUBLISH_DATE, ORIGINAL_PRICE, SELLING_PRICE, "DB_KEY") VALUES ('5', '333', 'Willy', 'Branch1', '25.01.2010', '450.000000', '400.000000', '00000086:00000002');...
For every Publisher, for its same Branch and for the same date find the Maximum Book_No value,if there are multiple records of the same maximum Book_No found thenfind the Maximum Book_ID value for that maximum Book_No and get all the details of that Book_ID row.
SQL:
SELECT BSD.BOOK_NO, BSD.BOOK_ID, BSD.PUBLISHER, BSD.MAIN_BRACH, BSD.PUBLISH_DATE, BSD.ORIGINAL_PRICE, BSD.SELLING_PRICEFROM BOOK_SELLING_DETAIL BSDInner Join(Select BSD1.BOOK_NO, Max(BSD1.BOOK_ID) As BOOK_ID, BSD1.PUBLISHER, BSD1.MAIN_BRACH, BSD1.PUBLISH_DATE from BOOK_SELLING_DETAIL BSD1Inner join(Select Max(BOOK_NO) As BOOK_NO, PUBLISHER, MAIN_BRACH, PUBLISH_DATE from BOOK_SELLING_DETAILGroup By PUBLISHER, MAIN_BRACH, PUBLISH_DATE) BSD2ONBSD1.PUBLISHER = BSD2.PUBLISHER And BSD1.MAIN_BRACH = BSD2.MAIN_BRACH And BSD1.PUBLISH_DATE = BSD2.PUBLISH_DATE And BSD1.BOOK_NO = BSD2.BOOK_NOGroup By BSD1.PUBLISHER, BSD1.MAIN_BRACH, BSD1.PUBLISH_DATE, BSD1.BOOK_NO) BSD3ONBSD.BOOK_NO = BSD3.BOOK_NO And BSD.BOOK_ID = BSD3.BOOK_ID And BSD.PUBLISHER = BSD3.PUBLISHER And BSD.MAIN_BRACH = BSD3.MAIN_BRACH And BSD.PUBLISH_DATE = BSD3.PUBLISH_DATEOrder By BSD.PUBLISHER, BSD.MAIN_BRACH, BSD.PUBLISH_DATE, BSD.BOOK_NO, BSD.BOOK_ID
Thanks for the DDL and example values you provided. I didn't have the time and energy required to look at this before today, and quite frankly, I haven't looked carefully at your SQL. Though I wonder if your question can be rephrased:
For each PUBLISHER, MAIN_BRACH and PUBLISH_DATE, find the record with the highest value for BOOK_NO. In case of duplicates, choose the one with the highest BOOK_ID.
If so, try this (simpler) SQL:
SELECT BSD.BOOK_NO, BSD.BOOK_ID, BSD.PUBLISHER, BSD.MAIN_BRACH, BSD.PUBLISH_DATE, BSD.ORIGINAL_PRICE, BSD.SELLING_PRICE
FROM BOOK_SELLING_DETAIL BSD
WHERE NOT EXISTS( SELECT *
FROM BOOK_SELLING_DETAIL BSD2
WHERE BSD.PUBLISHER = BSD2.PUBLISHER
AND BSD.MAIN_BRACH = BSD2.MAIN_BRACH
AND BSD.PUBLISH_DATE = BSD2.PUBLISH_DATE
AND ( BSD.BOOK_NO < BSD2.BOOK_NO
OR ( BSD.BOOK_NO = BSD2.BOOK_NO
AND BSD.BOOK_ID < BSD2.BOOK_ID ) ) )
HTH,
Set