SQL Query to count entire duplicate row - sql

I am looking for help with a query to do the following:
Before the insert of a row, find how many rows in 2 tables have the same information as is being inserted.
So basically I am looking to see if this row will be a complete duplicate.
I want to base this on all the columns, not just the PK, because if there is even one column different then this is a valid insert.
This is something along the lines of what I need, although incorrect:
SELECT COUNT(*)
FROM ORDER_TRF_HEADER
WHERE
((SELECT * FROM ORDER_TRF_HEADER_COMPLETE WHERE MA_PONUM = '29608207') = (SELECT * FROM ORDER_TRF_HEADER WHERE MA_PONUM = '29608207'));
Table - ORDER_TRF_HEADER
MA_CUST VARCHAR2(8 BYTE)
MA_PONUM VARCHAR2(30 BYTE)
MA_ODATE VARCHAR2(8 BYTE)
MA_ITEMS NUMBER(3,0)
MA_SALEM VARCHAR2(2 BYTE)
MA_PDAYS NUMBER(3,0)
MA_CURR VARCHAR2(3 BYTE)
Table - ORDER_TRF_HEADER_COMPLETE
MA_CUST VARCHAR2(8 BYTE)
MA_PONUM VARCHAR2(30 BYTE)
MA_ODATE VARCHAR2(8 BYTE)
MA_ITEMS NUMBER(3,0)
MA_SALEM VARCHAR2(2 BYTE)
MA_PDAYS NUMBER(3,0)
MA_CURR VARCHAR2(3 BYTE)
Thanks

I want to base this on all the columns, not just the PK, because if there is even one column different then this is a valid insert.
then your issue is that you have NOT defined your primary key correctly.
Certainly there are good reasons for not maintaining a primary key consisting of every attribute in the record, however a better solution than checking for duplicates in such a clumsy way before inserting would be to maintain a has of the data as a unique key.

You can try INTERSECT.
SELECT COUNT(*)
FROM (SELECT *
FROM order_trf_header_complete
WHERE ma_ponum = '29608207'
INTERSECT
SELECT *
FROM order_trf_header
WHERE ma_ponum = '29608207') ;
Note:: You better use all column names explicitly instead of select *

Related

Get value from table oracle (xmltype)

How can i get xml data from a table,
CREATE TABLE PCRD_3DS_SOAP_LOGS
(
SERVICE_NAME VARCHAR2(50 BYTE) NOT NULL,
REQUEST_ID VARCHAR2(50 BYTE) NOT NULL,
ERROR_CODE CHAR(5 BYTE),
REQUEST SYS.XMLTYPE,
RESPONSE SYS.XMLTYPE,
USER_CREATE VARCHAR2(15 BYTE),
DATE_CREATE DATE,
USER_MODIF VARCHAR2(15 BYTE),
DATE_MODIF DATE
)
I get this error when I execute the select query:
select * from PCRD_3DS_SOAP_LOGS
Access violation at address 659A0C4B in module 'OraClient12.Dll'. Read of address 00000008
SELECT * FROM PCRD_3DS_SOAP_LOGS;
Should work, however, if Toad cannot handle the XMLTYPE data type then you can explicitly convert them to a string using XMLTYPE's getStringVal or getClobVal methods:
SELECT service_name,
request_id,
error_code,
p.request.getClobVal() AS request,
p.response.getClobVal() AS response,
user_create,
date_create,
user_modif,
date_modif
FROM PCRD_3DS_SOAP_LOGS p;
(You do need to include the table name or alias before the column name.)
db<>fiddle here

Migrate relational table to Redis

Currently, I have a system that record records at oracle database, a specific table. I'm want change to Redis, but I'm with some doubts.
Field's table:
BRAS_INTERFACE VARCHAR2(30 BYTE) No 1
CLVAN NUMBER(10,0) No 2
NAS_IDENTIFIER VARCHAR2(100 BYTE) No 3
NAS_IP_ADDRESS VARCHAR2(15 BYTE) No 4
SVLAN NUMBER(10,0) No 5
FRAMED_IP_ADDRESS VARCHAR2(15 BYTE) Yes 6
CLASS VARCHAR2(100 BYTE) Yes 7
MAC_ADDRESS VARCHAR2(20 BYTE) Yes 8
PROFILE VARCHAR2(100 BYTE) Yes 9
TIME_STAMP TIMESTAMP(6) Yes 10
TYPE_TICKET VARCHAR2(10 BYTE) Yes 11
SMART_INTERFACE VARCHAR2(100 BYTE) Yes 12
CVLAN NUMBER(10,0) Yes 13
Constraint's table:
"BRAS_INTERFACE" IS NOT NULL
"CLVAN" IS NOT NULL
"NAS_IDENTIFIER" IS NOT NULL
"NAS_IP_ADDRESS" IS NOT NULL
"SVLAN" IS NOT NULL
The table keep PPPoE sessions, when a subscriber go to up, then insert a record, when a subscriber go to down, then delete a record, both cases, the fields: BRAS_INTERFACE, CLVAN, NAS_IDENTIFIER, NAS_IP_ADDRESS and SVLAN useds as constraint.
I do querys at table by constraints or by any another field.
With Redis how I can to do some thing like relational table?
If you have questions about what Redis can do I would think you should look at the vendor site: https://redis.io/topics/introduction. Oracle and SQL Server both support in-memory tables by the way.

How do I fix SQL Error: ORA-00001: unique constraint (ALERTS2.PK_UP_MODULE_MASTER) violated

Gives me error when I try to insert and it finally inserts after couple of retries with out any error.
SQL Error: ORA-00001: unique constraint (ALERTS2.PK_UP_MODULE_MASTER) violated.
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
INSERT statement:
INSERT INTO up_module_master
(
mr_id,
mr_name,
mr_desc,
mr_parent,
created_by,
created_date,
modified_date,
module_type,
module_link,
link_text,
help_text shortcut_link,
shortcut_name,
shortcut_flag,
module_display_name
)
SELECT max(u1.mr_id)+1,
'Notification Engine',
'Notification Engine Module',
0,1,
SYSDATE,
'',
'',
'../../jalsweb/Logout.jsp',
'HTTP',
'',
'',
'',
0,
'Notification Engine'
FROM up_module_master u1;
Below is the table definition:
CREATE TABLE "up_module_master"
(
"mr_id" NUMBER (10, 0) NOT NULL ENABLE,
"mr_name" VARCHAR2 (200 byte) NOT NULL ENABLE,
"mr_desc" VARCHAR2 (250 byte),
"mr_parent" NUMBER,
"created_by" NUMBER,
"created_date" TIMESTAMP (6),
"modified_date" TIMESTAMP (6),
"module_type" VARCHAR2 (100 byte),
"module_link" VARCHAR2 (200 byte),
"link_text" VARCHAR2 (250 byte),
"help_text" VARCHAR2 (250 byte),
"shortcut_link" VARCHAR2 (400 byte),
"shortcut_name" VARCHAR2 (100 byte),
"shortcut_flag" NUMBER,
"module_display_name" VARCHAR2 (100 byte),
"audit_type" VARCHAR2 (100 byte),
"service_id" NUMBER,
"module_regis_type" NUMBER DEFAULT 1,
CONSTRAINT "PK_UP_MODULE_MASTER" PRIMARY KEY ("mr_id"),
CONSTRAINT "UP_MODULE_MASTER_UP_MODUL_FK1" FOREIGN KEY ("mr_parent")
REFERENCES "up_module_master" ("mr_id") ENABLE
)
Looks like MR_ID is not an identity seed. If another process is attempting to insert a record at the same time as you, both will try to insert the same ID and you will get this error. I suggest that you change the column to be auto incrementing. You will need to create a sequence and then a trigger if using pre version 12 or the identity column if using later versions:
Oracle: how to create an identity column?
The link above has all the details for doing this.
the problem is, that someone other inserted and commited a row with the same key meanwhile
consider using a sequence (it looks like the sequence is already defined):
SELECT seq_name.nextval, ... FROM dual
The reason why it's failing is because "select max(mr_id) + 1 ..." is going to be a fixed number for all rows that you're selecting - it's not going to increment for each row in your select statement. (Duh! See comments below!)
As others have said, use a sequence! (Yes, there are other ways you could use to get unique values as part of your select statement, but they'd be the wrong thing to use. Sequences FTW!)

auto_increment with varchar in oracle

i have this table
CREATE TABLE WishList(
idWishList VARCHAR2(40 BYTE) ,
WishListName VARCHAR2(40 CHAR) NOT NULL,
id_User VARCHAR2(40 BYTE) NOT NULL
)
now how can i use auto_increment with varchar in oracle ??
You can add a trigger:
create or replace trigger some_trig_name
before insert on WishList
for each row
begin
:new.idWishList := to_char(your_sequence.nextval);
end some_trig_name;
In the example I used a seq but you can put whatever you want
As I remember, Oracle doesn't have an auto_increment functionality. It has sequences and developers should add special function like getNextId() and use it in insert statements like
insert into table (id,...) values(getNextId() ,..)
So, you can implement you own function which returns new id for your field with your own algorithm.

SQL server: retrieve grouped data from a table

Write SQL query based on info below Table TRACK_BY_WCN
CREATE TABLE CONTRACTOPS.TRACK_BY_WCN(
CLAIM_TYPE CHAR(1 BYTE)
,LOBID CHAR(3 BYTE)
,WCN VARCHAR2(10 BYTE)
,RECEIVED_DATE DATE
,FOUND_DATE DATE
,CLAIM_NUMBER VARCHAR2(10 BYTE) DEFAULT NULL
,HOLD_FLAG CHAR(1 BYTE) DEFAULT NULL
,LOCK_FLAG VARCHAR2(3 BYTE) DEFAULT NULL
,BILLED NUMBER(16,2))
There are data in first 3 columns, CLAIM_TYPE, LOBID, WCN, and there is program doing match by WCN. When found, the program will update all other fields. Please use one SQL to get count on how many WCN and how many matched claims, by claim type.
It's hard to tell what you are asking exactly. This might be what you want:
Count rows per WCN:
SELECT WCN, count(*) AS row_count
FROM CONTRACTOPS.TRACK_BY_WCN
GROUP BY WCN;
Count rows per CLAIM_TYPE
SELECT CLAIM_TYPE, count(*) AS row_count
FROM CONTRACTOPS.TRACK_BY_WCN
GROUP BY CLAIM_TYPE;
Count claims per WCN and CLAIM_TYPE
SELECT WCN, CLAIM_TYPE, count(*) AS row_count
FROM CONTRACTOPS.TRACK_BY_WCN
GROUP BY WCN, CLAIM_TYPE;