This question already has answers here:
Oracle "(+)" Operator
(4 answers)
Closed 1 year ago.
I have this Oracle code, which I need to convert to SQL Server:
FROM
dbo.userid t,
dbo.securityuser us,
dbo.dbaudit dba
WHERE
t.userid = us.userid
t.userid = dba.keyvalue(+)
I have a problem with
t.userid = dba.keyvalue(+)
Here the plus operator is after the column and the left joins are done using
table1.col(+) = table2.col
Please help me to understand what actually it is doing.
I think you want:
FROM dbo.userid t JOIN
dbo.securityuser us
ON t.userid = us.userid LEFT JOIN
dbo.dbaudit dba
ON t.userid = dba.keyvalue
Related
This question already has an answer here:
SQL - Unequal left join BigQuery
(1 answer)
Closed 4 years ago.
I want to have a left join in bigquery.
SELECT id,mtr,name FROM (SELECT userid,mtr,name FROM
results_20180612_230337
LEFT JOIN table1 ON id=myid where
partitiondate=CAST("2018-05-29" AS DATE)) LEFT JOIN `table2` t2
ON
(CASE
WHEN(SUBSTR(name,1,6)='000000') THEN mtr = CAST(bccbnc AS STRING)
WHEN(CHAR_LENGTH(CAST(bccbnc AS STRING))>5) THEN SUBSTR(name,1,6) =
CAST(bccbnc AS STRING)
ELSE SUBSTR(name,1,5) = CAST(bccbnc AS STRING)
END)
I am getting error
Error: LEFT OUTER JOIN cannot be used without a condition that is an equality of fields from both sides of the join.
It works if I remove CASE.
BigQuery, unlike MySQL is not very good at joining on complex relationships.
I suggest you create an intermediary/temporary (see here) table where you can then join on a equality (even a view works for those matters)
You can create a column that uses that case statement:
CASE
WHEN(SUBSTR(name,1,6)='000000') THEN mtr
WHEN(CHAR_LENGTH(CAST(bccbnc AS STRING))>5) THEN SUBSTR(name,1,6)
ELSE SUBSTR(name,1,5) end as column_to_join_onbccbnc
And then on join on it
This question already has answers here:
How do I convert a "legacy" left outer join statement in Oracle?
(1 answer)
Complex Left Outer Joins in Oracle, converting to PostgreSQL
(1 answer)
Convert Oracle legacy outer join to Ansi SQL
(2 answers)
Convert Oracle outer join to SQL Server
(1 answer)
In Oracle, in regards to syntax - how do I convert the (+) syntax to modern conventional JOIN?
(2 answers)
Closed 5 years ago.
I need to implement the old style SQL outer join with condition to the new style.
I am unable to convert the last line of the Join with condition.
Old Style Query:
SELECT cpd.customer_ref, cpd.product_seq, bci.contract_inst_id,
bci.start_dat bci_start_dat, bci.end_dat bci_end_dat
FROM custproductdetails cpd, balcontractinstance bci
WHERE cpd.customer_ref = bci.customer_ref(+)
AND cpd.contract_seq = bci.contract_seq(+)
AND cpd.end_dat >= bci.start_dat(+) AND cpd.end_dat <= bci.end_dat(+);
I assume you are going from the oracle syntax to sqlserver etc, which requires the ansi syntax, which is better to use going forward in general, regardless of database
Select a.a,b.a
From a left join b on a.a = b.a
Is the same as
Select a.a, b.a
From a, b
Where a.a = b.a(+)
I believe this does what you want:
SELECT cpd.customer_ref, cpd.product_seq, bci.contract_inst_id,
bci.start_dat bci_start_dat, bci.end_dat bci_end_dat
FROM custproductdetails cpd LEFT JOIN
balcontractinstance bci
ON cpd.customer_ref = bci.customer_ref AND
cpd.contract_seq = bci.contract_seq AND
cpd.end_dat >= bci.start_dat AND
cpd.end_dat <= bci.end_dat;
The general rule is that the table referenced with the (+) gets additional rows added. That makes it the second table in the LEFT JOIN.
Old Style Query:
SELECT cpd.customer_ref, cpd.product_seq, bci.contract_inst_id,
bci.start_dat bci_start_dat, bci.end_dat bci_end_dat
FROM custproductdetails cpd, balcontractinstance bci
WHERE cpd.customer_ref = bci.customer_ref(+)
AND cpd.contract_seq = bci.contract_seq(+)
AND cpd.end_dat >= bci.start_dat(+)
AND cpd.end_dat <= bci.end_dat(+);
'New' Style Query:
SELECT cpd.customer_ref, cpd.product_seq, bci.contract_inst_id,
bci.start_dat bci_start_dat, bci.end_dat bci_end_dat
FROM custproductdetails cpd LEFT JOIN balcontractinstance bci
ON cpd.customer_ref = bci.customer_ref
AND cpd.contract_seq = bci.contract_seq
AND cpd.end_dat >= bci.start_dat
AND cpd.end_dat <= bci.end_dat;
As you can see it's pretty similar.
This question already has answers here:
Update a table using JOIN in SQL Server?
(13 answers)
Closed 6 years ago.
I have a simple select statement that identifies the rows I want to update. Basically i want to copy the vad_description to the vb_description and can't quite figure this out. Any Help would be appreciated.
SELECT
variant_bom.vb_id
,variant_bom.vb_description
,variant_detail.vad_description
FROM dbo.variant_bom
INNER JOIN dbo.variant_detail
ON variant_bom.vb_vad_id = variant_detail.vad_id
INNER JOIN dbo.variant_setting
ON variant_setting.vas_vad_id = variant_detail.vad_id
WHERE variant_setting.vas_manufactured_variant = 1
AND variant_setting.vas_discontinued_product = 0
Try something like this
UPDATE vb
SET vb.vb_description = vd.vad_description
FROM dbo.variant_bom vb
INNER JOIN dbo.variant_detail vd
ON vb.vb_vad_id = vd.vad_id
INNER JOIN dbo.variant_setting vs
ON vs.vas_vad_id = vd.vad_id
WHERE vs.vas_manufactured_variant = 1
AND vs.vas_discontinued_product = 0
Giving Alias name to tables will make your query more readable
This question already has answers here:
How do I create a table based on another table [duplicate]
(2 answers)
Closed 6 years ago.
everyone! I would like to save the table after I used INNER JOIN.
CREATE TABLE result AS (
SELECT measures.Day,
SELECT measures.Day,
stations.Name,
measures.name_measure,
measures_of_stations.Count,
measures.unit
FROM
measures_of_stations
INNER JOIN
stations
ON measures_of_stations.id_station = stations.id_station
INNER JOIN
measures
ON measures_of_stations.id_measure = measures.id_measure)
But I have an error "Invalid syntax next to ( ". Why?
Thank you in advance :)
You need to use the INTO clause, see example below:
SELECT measures.Day,
stations.Name,
measures.name_measure,
measures_of_stations.Count,
measures.unit INTO result
FROM
measures_of_stations
INNER JOIN
stations
ON measures_of_stations.id_station = stations.id_station
INNER JOIN
measures
ON measures_of_stations.id_measure = measures.id_measure
SELECT measures.Day,
stations.Name,
measures.name_measure,
measures_of_stations.Count,
measures.unit
INTO result
FROM
measures_of_stations
INNER JOIN
stations
ON measures_of_stations.id_station = stations.id_station
INNER JOIN
measures
ON measures_of_stations.id_measure = measures.id_measure
This question already has answers here:
Oracle "(+)" Operator
(4 answers)
Closed 9 years ago.
We tried to migrate from Oracle to Postgres. We use ora2pg , but we have an error with this code:
SELECT DISTINCT UPU.USUA_C_USUARIO
FROM GN_USUARIOS U,TR_USUARIOS_X_PERFILES_USUARIO UPU,TR_V_PERFILES_USUARIOS PU
WHERE (U.C_USUARIO = UPU.USUA_C_USUARIO(+))
AND (UPU.PEUS_X_PEUS = PU.X_PEUS)
AND U.C_USUARIO = USU.C_USUARIO))
OR NOT EXISTS (
SELECT UPU2.USUA_C_USUARIO
FROM TR_USUARIOS_X_PERFILES_USUARIO UPU2
WHERE UPU2.USUA_C_USUARIO = USU.C_USUARIO)
OR USER = (
SELECT V_CONSTANTE
FROM GN_CONSTANTES
WHERE C_CONSTANTE = 'TRUSUPROP')
We have an error with PU.USUA_C_USUARIO(+). We dont have enough experience in this kind of conversions. How can we transform the code with LEFT OUTER JOIN ?
Thanks!
Probably like so:
FROM GN_USUARIOS U
LEFT JOIN TR_USUARIOS_X_PERFILES_USUARIO UPU ON U.C_USUARIO = UPU.USUA_C_USUARIO
LEFT JOIN TR_V_PERFILES_USUARIOS PU ON UPU.PEUS_X_PEUS = PU.X_PEUS
WHERE U.C_USUARIO = USU.C_USUARIO)
Or possibly:
FROM GN_USUARIOS U
LEFT JOIN ( SELECT UPU.USUA_C_USUARIO, ...
FROM TTR_USUARIOS_X_PERFILES_USUARIO UPU
JOIN TR_V_PERFILES_USUARIOS PU ON UPU.PEUS_X_PEUS = PU.X_PEUS
) UPU_PU ON U.C_USUARIO = UPU_PU.USUA_C_USUARIO
WHERE U.C_USUARIO = USU.C_USUARIO)
In either case, be wary that there's a USU table that is defined nowhere and mismatched parenthesis in your query.