[SQL] Where clause problem with subqueries
Hi,
I'm writing a query for an apex application where i have a field (P47_UNNR) for filtering. In my where clause I try to do this:
... AND qo.pk_id IN
CASE
WHEN :P47_UNNR IS NULL
THEN
(SELECT pk_id FROM quote_orders)
ELSE
(SELECT QOR.FK_QUOTE_ORDER_ID
FROM QUOTE_ORDER_RIDS QOR
JOIN
RIDS RID
ON RID.PK_ID = QOR.FK_RID_ID
WHERE RID.NAME LIKE :P47_UNNR)
END
But it gives an error "ORA-01427: single-row subquery returns more than one row"
I have tried multiple ways to get around this problem but don't seem to be able to do this. Does anyone have a suggestion on how to solve this?
Hi Niels,
First try with separating the query.
First try with:
CASE
WHEN :P47_UNNR IS NULL
THEN
(SELECT pk_id FROM quote_orders)
END;check SELECT pk_id FROM quote_orders this query returning only one values or not???
Then try with
CASE
WHEN :P47_UNNR IS NULL
THEN
(SELECT pk_id FROM quote_orders)
ELSE
(SELECT QOR.FK_QUOTE_ORDER_ID
FROM QUOTE_ORDER_RIDS QOR
JOIN
RIDS RID
ON RID.PK_ID = QOR.FK_RID_ID
WHERE RID.NAME LIKE :P47_UNNR)
ENDCheck this
SELECT QOR.FK_QUOTE_ORDER_ID
FROM QUOTE_ORDER_RIDS QOR
JOIN
RIDS RID
ON RID.PK_ID = QOR.FK_RID_ID
WHERE RID.NAME LIKE :P47_UNNRquery returning one values or not??
If those returns more than one value , the check whether there is any duplication value's present, remove that duplicate value from your table.
if you cant remove just add rownum =1 condition in your where clause.
Cheers,
San
Similar Messages
-
Where clause problem with sub-queries in forms 6i
where is the best place to put a sub query?? I have been using the set block property, however when running a sub query an alternative method must be used. what are some other options?? I have tried to have the query directly in the data block property palette but to no avail...
There are 2 tables project and assignment
maximum resources cannot be exceeded therefore a count of employees
on the assignment table establishes that there are open spaces on the project.
This code Here is my code for my where clause on the data block
project.resources_maximum >
(Select Count(assignment.employee_ID)
From assignment
Where assignment.project_ID = project.project_ID
group by assignment.project_ID
and project.end_date>sysdate;
I was reading that the project table must be defined in the from clause
to have the query go row by row, otherwise multiple rows are returned
however I cannot define the project in the from,
could this be why this doesn't work???
original SQL that does work
Need to migrate this to forms
Select project.project_ID
from project
Where project.resources_maximum >
(Select Count(assignment.employee_ID)
From assignment
Where assignment.project_ID = project.project_ID
group by assignment.project_ID
and project.end_date>sysdate;Looking at your query that works at the bottom, I do not see any reason that you would need to include the Assignment table in the From list. Just use the same where clause in the form:
Where project.resources_maximum
> (Select Count(assignment.employee_ID)
From assignment
Where assignment.project_ID = project.project_ID
group by assignment.project_ID ) -
PL/SQL: how to use in parameter in select sql where clause
Hi
in a procedure, I need to apply 'in parameter' in 'where clause' along with other table fields. Purpose is to create dynamic select querry with multiple conditions.
select count(*) from table xx
where y_code=2008 and v_type in ('SI', 'TI', 'DI') ;
my requirement is replace 'and v_type in ('SI', 'TI', 'DI')' with in parameter. pls note in paramter may contain null value.
Regards... e.g. why on earth do you want to pass in a string to be appended to the WHERE clause of an SQL.I second that and I strongly advice NOT to do it. If you really want to do it, then come back and show us, how you would prevent SQL injection. This approach is too dangerous (and too complex) IMHO.
Do it straight forward as in the article of Tom Kyte (link in the post of BluShadow above) -
[Solved] Named Bind Variables at Runtime - SQL WHERE clause issue
Hey 'all,
I've been having this issue today with a Search page using Named Bind Variables at Runtime for the search parameters for the WHERE clause in the view objects SQL.
I've got everything working except for a clearing method which I've created so that the user can clear the current WHERE clause from the SQL statment and set it as 1=2 (so that it doesn't do a blind query on load).
The method can clear and set the WHERE clause to 1=2 only when there is already one there.
Below are the methods: (located in my view object class)
public void findInvoiceById(Number invoiceId){
setWhereClause("invoice_id = :P_INVOICE_ID");
defineNamedWhereClauseParam("P_INVOICE_ID",null,null);
setNamedWhereClauseParam("P_INVOICE_ID",invoiceId);
executeQuery();
public void clearCriteria(){
setWhereClause("1=2");
removeNamedWhereClauseParam("P_INVOICE_ID");
executeQuery();
}The error which I get is the following - this happens when the button is pressed twice in a row, or when no query has been passed previously.
1. JBO-29000: Unexpected exception caught: oracle.jbo.NoDefException, msg=JBO-25058: Definition P_INVOICE_ID of type Variable not found in SupplierInvoicesView1
2. JBO-25058: Definition P_INVOICE_ID of type Variable not found in SupplierInvoicesView1
Any help with this would be greatly appreciated!
Cheers,Hi Bonnie,
we have it working ok, but still feel that there is room for improvement in the design.
For us the key factors are:
Pages based on the same view object that can be queried multiple ways.
We don't want to put design time bind variables in because it limits the use of the VO
We don't wan't multiple VO's with different where clauses.
The page is displaying the same table columns and fields, but the where clause must be dynamic.
We only want to query on the search field entered (some of our tables are massive)
TopLink named queries are really what we are after, but we don't want to forgo all the other ADF BC functionality. The only examples of ViewCriteria in the developer guide had literals in the where clause and no bind variables. The View Criteria may still be an option, but it appeared quite complex compaired to directly adding and removing bind variables at runtime.
a couple of footnotes:
the following methods are used to clear the runtime variables prior to reusing the VO (thanks to John Stegman for the pointer on the exception handler):
public void clearBindVariable(String bindVariableName){
try
removeNamedWhereClauseParam(bindVariableName);
catch (NoDefException e)
public void clearBindVariables(){
clearBindVariable("P_INVOICE_ID");
clearBindVariable("P_INVOICE_NUM");
clearBindVariable("P_SUPPLIER_NAME");
clearBindVariable("P_INVOICE_DATE_FROM");
clearBindVariable("P_INVOICE_DATE_TO");
clearBindVariable("P_SUPPLIER_NUMBER");
}We are using 1=1 and 1=2 in the where clause to supress blind querying. 1=2 is applied when ever we are not explicitely searching for something. We had a problem with using the refresh condition ${adfFacesContext.postback == true} which I posted about here:
executeQuery called twice using ${adfFacesContext.postback == true}
Would still gladly hear other ideas on a better reuse design.
regards,
Brenden -
Prompted value corrupts SQL WHERE clause - bug?
Using 10.1.3.4...
I implemented a simple pivot based request that navigates to a second request when the user drill down on one of the fields. This field is set to "value is prompted" in my second request. (I chose navigate method above drill (dimensions) for a few reasons not really important to this posting, mainly to do with format of requests at different levels)
All good and the drill down works well, parameters are passed correctly, except then I noticed that totals in my second request doesn't accurately tie back to my first request. After some research I found a very odd reason for this, my WHERE clause is getting corrupted - which almost looks like a bug in OBIEE and were wondering if anybody else has seen this behaviour from OBIEE and know a work around (before I try the Oracle support channels)
From Answers the request SQL is (I'll highlight the lines getting messed up):
SET VARIABLE DISABLE_CACHE_HIT = 1;
SELECT
BUSINESS_UNIT.Segment saw_0, BUSINESS_UNIT."Business Unit" saw_1, OPPORTUNITY.CLOSEPROBABILITY saw_2, OPPORTUNITY.CLOSEPROBABILITY saw_3, YEAR(OPPORTUNITY.ESTIMATEDCLOSE) saw_4, OPPORTUNITY_ADDON.TCV_IN_USD/1000000 saw_5, OPPORTUNITY_ADDON.WEIGHTED_TCV_IN_USD/1000000 saw_6, CASE OPPORTUNITY.CLOSEPROBABILITY WHEN 100 THEN OPPORTUNITY_ADDON.TCV_IN_USD/1000000 ELSE 0 END saw_7 FROM "Sales"
WHERE (OPPORTUNITY.STAGE NOT IN ('Lost', 'On Hold')) AND (YEAR(OPPORTUNITY.ESTIMATEDCLOSE) >= YEAR(CURRENT_DATE)) AND
((({color:#ff0000}OPPORTUNITY.CLOSEPROBABILITY > 25) AND (TIMESTAMPDIFF(SQL_TSI_MONTH, CURRENT_DATE,OPPORTUNITY.ESTIMATEDCLOSE) <= 4)) OR ((OPPORTUNITY.CLOSEPROBABILITY >= 10) AND (TIMESTAMPDIFF(SQL_TSI_MONTH, CURRENT_DATE,OPPORTUNITY.ESTIMATEDCLOSE) > 4{color})))
ORDER BY saw_0, saw_1, saw_2, saw_3, saw_4, saw_5, saw_6, saw_7
Which results in the following SQL request (from NQQuery.log)... The prompted value (BUSINESS_UNIT.Segment) is added correctly to the WHERE clause, but see how the remainder get's changed:
SQL Request:
SET VARIABLE QUERY_SRC_CD='Report',SAW_DASHBOARD='/shared/01 - Financials/_portal/4. Pipeline',SAW_DASHBOARD_PG='Pipeline',SAW_SRC_PATH='/shared/01 - Financials/4. Pipeline/Pipeline - Current - T2',DISABLE_CACHE_HIT = 1;
SELECT
BUSINESS_UNIT.Segment saw_0, BUSINESS_UNIT."Business Unit" saw_1, OPPORTUNITY.CLOSEPROBABILITY saw_2, OPPORTUNITY.CLOSEPROBABILITY saw_3, YEAR(OPPORTUNITY.ESTIMATEDCLOSE) saw_4, OPPORTUNITY_ADDON.TCV_IN_USD/1000000 saw_5, OPPORTUNITY_ADDON.WEIGHTED_TCV_IN_USD/1000000 saw_6, CASE OPPORTUNITY.CLOSEPROBABILITY WHEN 100 THEN OPPORTUNITY_ADDON.TCV_IN_USD/1000000 ELSE 0 END saw_7 FROM "Sales"
WHERE (BUSINESS_UNIT.Segment = 'Enterprise') AND (OPPORTUNITY.STAGE NOT IN ('Lost', 'On Hold')) AND (YEAR(OPPORTUNITY.ESTIMATEDCLOSE) >= YEAR(CURRENT_DATE)) AND
((({color:#ff0000}OPPORTUNITY.CLOSEPROBABILITY >= 10) AND (TIMESTAMPDIFF(SQL_TSI_MONTH, CURRENT_DATE,OPPORTUNITY.ESTIMATEDCLOSE) > 4)) OR ((OPPORTUNITY.CLOSEPROBABILITY >= 10) AND (TIMESTAMPDIFF(SQL_TSI_MONTH, CURRENT_DATE,OPPORTUNITY.ESTIMATEDCLOSE) > 4{color})))
ORDER BY saw_0, saw_1, saw_2, saw_3, saw_4, saw_5, saw_6, saw_7
Which definitely explains why my totals do not add up when drilling down. Interestingly, if I run my second request without the prompt from Answers, the SQL request works like a charm:
SET VARIABLE QUERY_SRC_CD='Report',SAW_SRC_PATH='/shared/01 - Financials/4. Pipeline/Pipeline - Current - T2',DISABLE_CACHE_HIT = 1;
SELECT BUSINESS_UNIT.Segment saw_0, BUSINESS_UNIT."Business Unit" saw_1, OPPORTUNITY.CLOSEPROBABILITY saw_2, OPPORTUNITY.CLOSEPROBABILITY saw_3, YEAR(OPPORTUNITY.ESTIMATEDCLOSE) saw_4, OPPORTUNITY_ADDON.TCV_IN_USD/1000000 saw_5, OPPORTUNITY_ADDON.WEIGHTED_TCV_IN_USD/1000000 saw_6, CASE OPPORTUNITY.CLOSEPROBABILITY WHEN 100 THEN OPPORTUNITY_ADDON.TCV_IN_USD/1000000 ELSE 0 END saw_7 FROM "Sales"
WHERE (OPPORTUNITY.STAGE NOT IN ('Lost', 'On Hold')) AND (YEAR(OPPORTUNITY.ESTIMATEDCLOSE) >= YEAR(CURRENT_DATE)) AND
((({color:#ff0000}OPPORTUNITY.CLOSEPROBABILITY > 25) AND (TIMESTAMPDIFF(SQL_TSI_MONTH, CURRENT_DATE,OPPORTUNITY.ESTIMATEDCLOSE) <= 4)) OR ((OPPORTUNITY.CLOSEPROBABILITY >= 10) AND (TIMESTAMPDIFF(SQL_TSI_MONTH, CURRENT_DATE,OPPORTUNITY.ESTIMATEDCLOSE) > 4{color})))
ORDER BY saw_0, saw_1, saw_2, saw_3, saw_4, saw_5, saw_6, saw_7
Anybody had the same problem before?Here's the excerpt (it's relative to crashing, but I think it should also address the bug):
# PRESENTATION SERVER CRASH AFTER UPGRADING TO 10.1.3.4 (Doc ID 756541.1)
crash when they run the reports containing Pivot Table. This has been a known issue with version ... subsequently upgraded to version
Doc Type:ALERTModified:2/10/2009 -
Apex 4.0 Image Buttons to update SQL Where clause of Report?
I made a table called Letters with 1 column in it called Letter and the data in it is simply A,B,C, to H. I made an apex form around this table and then created two image buttons A and B that display above the reporting area b/c i want to be able to click on the A image button and have it update the Where clause for the Letters table to be "Where Letter = A" (so once you click the A button, only the A will appear), same for the B button. I have attached a link to an album of images to show what i'm trying to do to better explain it. I just can't figure out what or how to make it so that the image button can update the where clause. I should note that i am relatively new to Apex and i tried using a dynamic action to do it but can't get this to work.
Link to images of what i have so far-> http://imgur.com/a/guxkd/oracle_apex_40_use_image_buttons
Any suggestions?
Edited by: Brobot on Feb 8, 2011 9:58 PMSince you are using some kind of button(with images or otherwise) , add some attributes to identify them together aswell as uniquely.
For instance if you add a name and an a common classname to each button
For example, in button attributes for A this could be
name="A" class="where_clause_button"You can use these attributes to trigger a Dynamic action which can refresh the report.
Since you want the report to be filtered based on the button(ie using the "name" attribute of the corresponding button) , you need to set that value in some hidden item, say P100_FILTER_LETTER. and add a where clase to your Report Region' SQL Query
WHERE <column name> = :P100_FILTER_LETTERNow create a Dynamic Action as
Event :Click
Triggering Element : jQuery selector
Selector : *.where_clause_button*
<li>True action 1 : Execute Javascript code
filter_item_name = 'P100_FILTER_LETTER'
this_button_name = $(this.triggeringElement).attr('name');
//Set session state of Hidden Item before refresh
var ajaxRequest=new htmldb_Get(null,$v('pFlowId'),'null',$v('pFlowStepId'));
ajaxRequest.add( filter_item_name ,this_button_name );
var ajaxResult=ajaxRequest.get();<li> True Action 2: Refresh
Affected Element: Region
Name : Choose Report Region Name
Hope it helps -
Trying to use parameter variable as column identifier in SQL where clause
Hey guys,
Doing a college project... would really appreciate some help. I am trying to use a variable in the where clause of a select cursor in PL/SQL. The code is this:
procedure results(p_search_entry varchar2, p_search_field varchar2) is
cursor c_results is
select * from physics_b where p_search_field = p_search_entry;
begin
for cv_results in c_results
loop
-- loop through actions
end loop;
The problem is that I don't know how to get the where clause to accept the variable passed into the procedure as the field name. Does anyone know the syntax for this?
Thanks very much!To suit your requirement use ref cursor..
If your database is 9i and upwards you can use sys_refcursor as I have used or else you can declare the cursor shown in the statement below
type c_result is ref cursor;
c_results c_result;
Jus replace these two statement in the example if your oracle database is prior to 9i
Eg:
procedure results(p_search_entry varchar2, p_search_field varchar2) is
qry_stmt VARCHAR2(1000) ;
c_results sys_refcursor;
begin
qry_stmt := 'select * from physics_b where '||p_search_field|| '='|| p_search_entry
open c_results for qry_stmt
loop
<fetch as like normal cursor>
<ur normal cursor operation etc....>
end loop;
end results;
Sorry I posted twice
Message was edited by:
Shasi -
Hello all,
i think it is an old problem but i cannot find a solution.
i have the following table
CREATE TABLE XX
ID CHAR(10)NOT NULL,
other colums
the table has some rows in it, but when i do the following Select, i get no rows back:
SELECT *
FROM XX
WHERE ID >= ''
( normally the '' is replaced by a variable, but i tried it also with SQL*Plus )
Any suggestions ?
nullyou'r right, but the problem is, i have to do with Oracle, DB2, SQL Server, Informix, and with ALL the other databases the empty string is NOT NULL, so you can compare it to values.
The problem is that the value is, that i have an application which is connected through ODBC resp. JDBC to different database servers, and only Oracle does the compare in that manner.
so far
<BLOCKQUOTE><font size="1" face="Verdana, Arial">quote:</font><HR>Originally posted by Eugenio:
The empty string '' means NULL and
NULL cannot be compared with values.
select * from dba_objects where object_name >= ''
gives "no rows selected"
If you try with ' ' (blank space) you'll have thousands of rows (in my new 8i test db 22436 ;).
Ciao<HR></BLOCKQUOTE>
null -
Problem with subqueries returning TIMESTAMP's
I've got problems with some subqueries returning TIMESTAMP values.
I've build a case for easy reproduction, with this query:
SELECT iil.iil_lot_num ,
(SELECT max ( lot_data_validade )
FROM lot
WHERE lot.lot_mat_cod = iil.iil_mat_cod AND
lot.lot_num = iil.iil_lot_num ) as validade
FROM iil
WHERE ( iil.iil_inv_serie = 109 ) and
( iil. iil_inv_num = 16 ) and
( iil.iil_mat_cod = 111 )
When I run it, it gives the error:
General error;-9999 POS(1) System error: invalid_indexorder
knldiag also gives:
2009-07-28 15:03:18 9943 ERR 51080 SYSERROR -9999 invalid_indexorder
I'm running on 7.6.06.03.
Previous versions were giving another message:
SQLCODE: -9999 System error: Otherwise unknown errorcode
If I change max ( lot_data_validade ) to max ( year (lot_data_validade) ), it works. The problem is specifically with fetching that timestamp value from the subquery.
Backup for reproduction of the problem is on:
http://www.tecnova.com.br/maxdb/backup_problem
(i've isolated only the tables involved in the problem, so the backup is tiny -> 4.3MB)HI Elke,
I had the same idea at first but was largely disappointed to find that this 'corrupt index' is indeed a temp. resultset:
--> max() query
OWNER TABLENAME COLUMN_OR_INDEX STRATEGY PAGECOUNT
DBA IIL RANGE CONDITION FOR KEY 61
IIL_INV_SERIE (USED KEY COLUMN)
IIL_INV_NUM (USED KEY COLUMN)
IIL_MAT_COD (USED KEY COLUMN)
INTERNAL TEMPORARY RESULT EQUAL CONDITION FOR KEY 1
IIL_INV_SERIE (USED KEY COLUMN)
DBA LOT NO STRATEGY NOW (ONLY AT EXECUTION TIME)
INTERNAL TEMPORARY RESULT TABLE SCAN 1
RESULT IS COPIED , COSTVALUE IS > 2 E10
The cost expectation is really awesome here...
--> max(year()) query
OWNER TABLENAME COLUMN_OR_INDEX STRATEGY PAGECOUNT
DBA IIL RANGE CONDITION FOR KEY 61
IIL_INV_SERIE (USED KEY COLUMN)
IIL_INV_NUM (USED KEY COLUMN)
IIL_MAT_COD (USED KEY COLUMN)
INTERNAL TEMPORARY RESULT EQUAL CONDITION FOR KEY 1
IIL_INV_SERIE (USED KEY COLUMN)
DBA LOT NO STRATEGY NOW (ONLY AT EXECUTION TIME)
RESULT IS COPIED , COSTVALUE IS
This time the optimizer ran out of words for the expected effort for this query execution...
The problem really seems to be the subquery-select as we can strip down the example to
select (select max(lot_data_validade) maxval
from lot
where lot.lot_mat_cod=111) as maxval
from dual
and still see the error...
regards,
Lars -
SQL Where clause when comparing dates and times in ASP
Hello,
I am trying to pull data from my database which is dependant on both the date and time in HH24 format. So, my where clause looks something like this:
select * from thisTable where activity_time >= myCurrentDate
(myCurrentDate is a variable that is built which gives it the following format DD-MON-YYYY HH24:MI:SS)
So, the actual passed string to my call is:
select * from thisTable where ACTIVITY_TIME >= '02-DEC-2008 18:22:00' order by ACTIVITY_TIME asc
However, when calling this, I get the famous "ORA-01830: date format picture ends before converting entire input string"
Can anyone please help me?!?!?!?
Thanks in advanceEnrique answered your immediate question, but I'd like to point up a broader issue, and that is that you should <b><u>always</u></b> use the TO_DATE and TO_CHAR functions at the sql statement level when working with date datatypes. That way you are never dependent on some default over which you have no control. I call that is 'defensive coding'.
-
Exclude duplicate values on SQL where clause statement
Hi!
Are some posibilities to exclude duplicate values do not using sql aggregate functions in main select statement?
Priview SQL statement
SELECT * FROM
select id,hin_id,name,code,valid_date_from,valid_date_to
from diaries
QRSLT
WHERE (hin_id = (SELECT NVL(historic_id,id)FROM tutions where id=/*???*/ 59615))
AND NVL(valid_date_to,to_date('22.12.2999','dd.mm.yyyy')) <= (SELECT NVL(valid_date_to,to_date('22.12.2999','dd.mm.yyyy'))FROM tutions where id= /*???*/ 59615)
AND trunc(valid_date_from) >=(SELECT trunc(valid_date_from)FROM tutions where id= /*???*/ 59615)
The result
ID HIN_ID NAME CODE VALID_DATE FROM VALID_DATE_TO
50512
59564
RE TU
01
07.06.2013 16:32:15
07.06.2013 16:33:28
50513
59564
TT2
02
07.06.2013 16:33:23
07.06.2013 16:33:28
50515
59564
TT2
02
07.06.2013 16:33:28
07.06.2013 16:34:42
50516
59564
ROD
03
07.06.2013 16:34:37
07.06.2013 16:34:42
VALID_DATE_TO & AND VALID_DATE_FROM tutions
07.06.2013 16:34:42
15.07.2013 10:33:23
In this case i got duplicate of entry TT2 id 50513 In main select statement cant use agregate functions are even posible to exclude this value from result modifying only the QLRST WHERE clause (TRUNC need to be here)
THANKS FOR ANY TIP !
ID.Hi, Ok this is working in this case
SELECT * FROM
select id,hin_id,name,code,valid_date_from,valid_date_to
from diaries ahs
QRSLT
WHERE (hin_id = (SELECT NVL(historic_id,id)FROM aip_healthcare_tutions where id=/*???*/ 59615))
AND NVL(valid_date_to,to_date('22.12.2999','dd.mm.yyyy')) <= (SELECT NVL(valid_date_to,to_date('22.12.2999','dd.mm.yyyy'))FROM tutions where id= /*???*/ 59615)
AND trunc(valid_date_from) >=(SELECT trunc(valid_date_from)FROM tutions where id= /*???*/ 59615)
AND NOT EXISTS
(SELECT null FROM diaries ahs WHERE ahs.valid_date_from < QRSLT.valid_date_from
AND QRSLT.hin_id=ahs.hin_id
AND QRSLT.code=ahs.code);
Result
50512
59564
RE TU
01
07.06.2013 16:32:15
07.06.2013 16:33:28
50513
59564
TT2
02
07.06.2013 16:33:23
07.06.2013 16:33:28
50516
59564
ROD
03
07.06.2013 16:34:37
07.06.2013 16:34:42
But if the Data in tutions row are theese(valid_date_to-null) then NO ROWS are returning and its logical because in full result list Valid_date_from column are logical incorect
valid_date_from valid_date_to
15.07.2013 10:33:23
NULL
ID HIN_ID NAME CODE VALID_DATE FROM VALID_DATE_TO
50510
59564
RE TU
01
07.06.2013 16:33:28
50511
59564
TT2
02
07.06.2013 16:34:41
50514
59564
ROD
03
07.06.2013 16:34:41
50520
59564
Params
04
03.07.2013 21:01:30
50512
59564
RE TU
01
07.06.2013 16:32:15
07.06.2013 16:33:28
50513
59564
TT2
02
07.06.2013 16:33:23
07.06.2013 16:33:28
50515
59564
TT2
02
07.06.2013 16:33:28
07.06.2013 16:34:42
50516
59564
ROD
03
07.06.2013 16:34:37
07.06.2013 16:34:42
Are that posible modifying where statement if the valid_date_to in tutions are null then theese records where in diary valid_date_to is null is correct to, but need to stay previos logic
D HIN_ID NAME CODE VALID_DATE FROM VALID_DATE_TO
50510
59564
RE TU
01
07.06.2013 16:33:28
null
50511
59564
TT2
02
07.06.2013 16:34:41
null
50514
59564
ROD
03
07.06.2013 16:34:41
null
50520
59564
Params
04
03.07.2013 21:01:30
null
Thanks !
ID. -
Can we use Case in Where Clause along with Exists
Hi Everybody,
Can we use Case in the where clause with exists? As i have a requirement in which i have to check whether value exists in 6 views, now depending on some value(gns_type )of select clause i have to attach a paticular exists else the performance dies.
Please go through the query any suggestion appreciated.
Thanks
SELECT count(*)
FROM
(SELECT eah.changed_date,
decode(eua.is_deleted, 'N', decode(eah.alert_type, NULL, 'GN', 'R', 'GAR', 'G', 'GAG', 'Y', 'GAY'), 'Y', decode(eah.alert_type, 'R', 'GDR', 'G', 'GDG', 'Y', 'GDY', NULL, 'GN'), NULL, 'GN') AS
alert_type,
decode(eac.pta_line, 'N', '') ptaline,
eac.exp_type_desc,
eac.supplier_name,
eac.transaction_id,
eah.gns_type,
eac.po_amount,
eac.po_end_date,
eah.notes,
eua.is_deleted,
eac.expenditure_type,
eua.gns_alert_summary_id,
eah.changed_date alert_date,
eua.user_alert_id,
eah.reference_number,
decode(eac.cms_pta_line,'N','',eac.cms_pta_line) cms_pta_line,
cms_po_amount,
cms_po_end_date,
mgns.is_decommitted,
eac.gns_alert_id,
eah.gns_type source_name
FROM xxdl.xxdl_sc_gns_alerts_summary eah,
xxdl.xxdl_sc_gns_detail_alerts eac,
xxdl.xxdl_sc_gns_user_alerts eua,
xxdl.xxdl_sc_manage_gns_master mgns
WHERE eah.gns_alert_summary_id = eac.gns_alert_summary_id
AND eah.gns_alert_summary_id = eua.gns_alert_summary_id
AND eah.transaction_id = eac.transaction_id
AND eah.transaction_id = mgns.transaction_id)
a
WHERE(EXISTS
(SELECT 1
FROM xxdl_sc_mng_gns_pta_req_hc_v x
WHERE x.transaction_id = a.transaction_id
AND x.source_name = a.source_name
AND x.project_id = 69309
AND x.task_id = 242528
AND x.award_id = 34694)
OR
EXISTS( SELECT 1
FROM xxdl_sc_mng_gns_pta_inv_hc_v x
WHERE x.transaction_id = a.transaction_id
AND x.source_name = a.source_name
AND x.project_id = 69309
AND x.task_id = 242528
AND x.award_id = 34694)
OR
EXISTS(SELECT 1
FROM xxdl_sc_mng_gns_pta_req_sc_v x
WHERE x.transaction_id = a.transaction_id
AND x.source_name = a.source_name
AND x.project_id = 69309
AND x.task_id = 242528
AND x.award_id = 34694)
OR
EXISTS(SELECT 1
FROM xxdl_sc_mng_gns_pta_inv_sc_v x
WHERE x.transaction_id = a.transaction_id
AND x.source_name = a.source_name
AND x.project_id = 69309
AND x.task_id = 242528
AND x.award_id = 34694)
OR
EXISTS( SELECT 1
FROM xxdl_sc_mng_gns_pta_po_sc_v x
WHERE x.transaction_id = a.transaction_id
AND x.source_name = a.source_name
AND x.project_id = 69309
AND x.task_id = 242528
AND x.award_id = 34694)
OR
EXISTS (SELECT 1
FROM xxdl_sc_mng_gns_pta_po_hc_v x
WHERE x.transaction_id = a.transaction_id
AND x.source_name = a.source_name
AND x.project_id = 69309
AND x.task_id = 242528
AND x.award_id = 34694)
AND TRUNC(alert_date) >= TRUNC(add_months(sysdate, -1))
AND TRUNC(alert_date) <= TRUNC(sysdate)
AND is_deleted = 'N'
ORDER BY changed_date DESCyou can do
WHERE
CASE WHEN (something) THEN
CASE WHEN EXISTS (SELECT * from ...) THEN 1 ELSE 0 END
WHEN (something else) THEN
CASE WHEN EXISTS (SELECT * from ...) THEN 1 ELSE 0 END
END = 1Looking at your current query, it looks like all those exist statements could be a lot neater, maybe like:
WHERE (69309,242528,34694) IN
(SELECT project_id,task_id,award_id FROM
(Select project_id,task_id,award_id,transaction_id,source_name
FROM
xxdl_sc_mng_gns_pta_req_hc_v
UNION ALL
Select project_id,task_id,award_id
xxdl_sc_mng_gns_pta_inv_hc_v
...) x
where a.transaction_id = x.transaction_id
and a.source_name = x.source_name
)or put the tuple in the where clause at the bottom -
I want to use dynamic where clause in select statement. For example in a query like
SELECT * FROM emp &where_clause_options
I am constructing my where_clause_option within a IF-ELSE-ENDIF construct which is soemthing like this.
if x=10 then
where_clause_option := 'where dept = 10 and job = 'CLERK'
else
where_clause_option := 'where sal >3000'
end if;
Now how to specify it in the select statement?
By the way DECODE statement does not work in WHERE clause.Thanks for your suggestion. I know that decode does not work that way in where clause although it may be used for establishing list of columns in the SELECT startement. And that is exactly what has raised this issue that then how to get the dynamical where clauses from within the code. By the way my code is plsql based and I am running it in sqlplus environment.
I have tried to use the lexical parameter along with a combinition of DEFINE but define is uncontrolable in a conditional construct and hence the DEFINE in the last part of the IF then elsif else construct overrides previous defines and thus always passes to &my_where_clause1 the value defined in the last DEFINE statement. Here is how I tried to use Define:
DECLARE --main
v_sex varchar2(5);
my_where_clause1 varchar2(50);
Function myfunction return boolean is
begin
some code..........
if v_sex = 'MALE' then
DEFINE my_where_clause1 = 'and AGE > 60';
else
DEFINE my_where_clause1 = 'and AGE between 45 and 55';
end if;
some code......
end -- Function myfunction;
CURSOR mycursor is select patient_id from patient_history where Symptom = 'RESPIRATORY' &my_where_clause1;
BEGIN -- main
some code.....
if myfunction = TRUE then
for v_mycursor in mycursor Loop
some code.....
end loop;
end if;
END -- main;
Although this provides me with lexical parameter functionality within my PLSQL code but I am unable to control the DEFINE. Neither DEFINE-lexicial combinition nor the DECODE are helping in this scenario.
I am sure that there would be some way to implement it. So my call for help is still on. -
Where clause problem in a subquery
I'll try to explain as detailed as possible.
Given the following set of data and the parameters passed the query must only return one row;
If the structure_chain is like the parameter passed, then select that row
If not then strip out the first number in both the parameter and the column,
e.i., '2.35364194.34889485' becomes '35364194.34889485'
The select is what is currently in the code and so far I've not been able to get the (new) desired results - customer changed/enhanced requirements
with TT as
(select 1 row_no, 22794978 old_child_id, 51755902 new_child_id, '1.35364194' structure_chain from dual union all
select 2, 22794978, 51755899, '1.23576950' from dual union all
select 3, 17872962, 51755893, '1.23576950' from dual union all
select 4, 17872962, 51756065, '1.35364194.34880851' from dual union all
select 5, 17872962, 51759249, '2.35364194.34880851' from dual union all
select 6, 17872962, 51759248, '1.23576950.22795468' from dual union all
select 7, 17872962, 51759250, '2.23576950.22795468' from dual )
select * from tt
where old_child_id = &1
and &2 like structure_chain ||'%'
17872962 '2.35364194.34880851' -- Return row_no 5
17872962 '1.23576950.22795468' -- Return row_no 6 - this returns more than one
17872962 '1.35364194.34880851' -- Return row_no 4
17872962 '2.23576950.22795468' -- Return row_no 7
22794978 '2.35364194.34889485' -- Return row_no 1 - does not return anything
22794978 '1.35364194.34889485' -- Return row_no 1Hi,
I'm not sure what you're asking.
It would help if you posted the results you want as clearly as you posted the sample data. For each set of parametes, post the desired result set.
I think you want to do two kinds of pattern matches, and return the results of the strictest one that has results.
That is, if there is a match on all parts of structure_chain, then return the rows that match all parts.
But if there is no match on all parts of structure_chain, then return the rows (if any) that match if we ignore the sub-atring before the first dot.
That's an example of a Top-N Query , and here's one way to do it:
WITH got_r_num AS
SELECT tt.*
, DENSE_RANK () OVER (ORDER BY CASE
WHEN '&2' LIKE structure_chain || '%'
THEN 1
ELSE 2
END
) AS r_num
FROM tt
WHERE old_child_id = &1
AND SUBSTR ( '&2'
, INSTR ('&2', '.')
) LIKE SUBSTR ( structure_chain
, INSTR (structure_chain, '.')
) || '%'
SELECT row_no, old_child_id, new_child_id, structure_chain
FROM got_r_num
WHERE r_num = 1
;With parameters &1=17872962 and &2=1.23576950.22795468, the query above produces this output:
` ROW_NO OLD_CHILD_ID NEW_CHILD_ID STRUCTURE_CHAIN
3 17872962 51755893 1.23576950
6 17872962 51759248 1.23576950.22795468because both rows matched the given &2, including the '1.' at the beginning. (The query you posted gave the same results in this case.)
With parameters &1=22794978 and &2=2.35364194.34889485, the query above produces:
ROW_NO OLD_CHILD_ID NEW_CHILD_ID STRUCTURE_CHAIN
1 22794978 51755902 1.35364194because there was no match when considering the '2.' at the beginning of &2, but the row shown does match when we ignore the '2.'.
The WHERE clause in the sub-query narrows the result set down to rows that meet at least the looser match reuirement.
The CASE expression ranks each row as 1 if it meets the stricter requirement, and 2 if it only met the looser one.
DENSE_RANK returns 1 for the lower of those numbers that was actually found. -
Binding an SQL "where" clause to a field in the report.
Hello everybody,
I have made a crystal report that works fine. Now, I need to add a specific query to the report and drag and drop the returned fields in the report.
The problem is that I need to add a query that contains a "Where" clause that is binded to a field already existing in the report, for example :
SELECT T0.Field1,
T0.Field2,
T0.Field3
FROM Table1 T0
WHERE T0.Field4=(a field from a report)
Is it possible to do it ? if yes, how can I do it.
Thank you in advance for your further responds,
Best Regards,
- Youssef -Moved to Report Design forum
You can't do it in that specific way. It would have to be done server side or use a subreport and then link the subreport on the field from the main report.
Don
Maybe you are looking for
-
IPod Not Being Seen By Windows, Need Help ASAP...!
I just bought my iPod last year, when to charge it, as well as get some stuff of the HDD, but Windows pops up with an error message saying it's not working. It was working fine a few days ago. Now, for all intents and purposes it seems dead, and ther
-
I converted a Word 2007 document to pdf format using the Word pdf converter "Save As Pdf." I have Reader XI to read the pdf document, but the pdf document opens in 136% view and I cannot make it open in 100% view. Using the "View" control only change
-
Business Engine and Integration Engine based on which Engine ABAP or Java
give me information about Business Engine and Integration Engine based on which Engine ABAP or Java Engine. What is Xapps and how it is related to XI
-
Touch screen display for HP Pavillion IPS LED Backlit Monitor
Does it exist?
-
I recently got a message with an exclamation mark stating "your computer name is already in use on this network. The name has been changed to ______" How did this happen, is it phishing, malware, or did someone hit some button on here to change it. I