CREATE TABLE... SELECT combining two MySQL tables and NULL values - mysql

I'm using this to join two tables (leaving out some of the fields here). All of the fields in the original tables are defined as VARCHAR, NOT NULL, with default ''.
CREATE TABLE newtable
SELECT
table1.field1,
table1.field2,
...
table2.field1,
table2.field2,
...
FROM
table1
LEFT JOIN table2 ON table1.id = table2.id
The join itself is working, however, table 1 has some rows which are not in table 2. The fields from table 2 are being added as NULL for those entries, when I need them to be empty strings. Is there a way to do that when creating the table?

IFNULL(table1.field1,'') AS table1_field1,
IFNULL leaves the value if it is not null otherwise it replaces it with the second parameter, empty string in your case

if you want the columns from table2 to be '' ..put an nvl ...this works in oracle
CREATE TABLE newtable as
SELECT
table1.field1,
table1.field2,
...
nvl(table2.field1,''),
nvl(table2.field2,''),
...
FROM
table1
LEFT JOIN table2 ON table1.id = table2.id

Related

Flushing out table according to results from another table

I have two interconnected tables: one stores some general result (table1), the other one details N rows for each result (table2).
Each record in table2 has a field recording the "auto_id" of the table1 row of reference (field is called "ref_id")
I intentionally deleted some records from the table1, but I left the referenced rows in table2.
How can I find all rows with invalid "ref_id"s in table2 that link to a no more existing "auto_id" in table1?
I was thinking something like
SELECT *
FROM table2
WHERE NOT EXISTS(
SELECT auto_id
FROM 'table1'
WHERE 'table2.res_id' = auto_id
)
but there-s obviously some error.
Thanks for the help!
You are using the wrong quotes. Single-quotes (apostrophes, or ASCII 39) are for literal strings. The easiest solution would be to remove the quotes:
SELECT *
FROM table2
WHERE NOT EXISTS(
SELECT auto_id
FROM table1
WHERE table2.res_id = auto_id
);
If you want to quote identifiers in MySQL, use backticks (ASCII 96).
SELECT *
FROM `table2`
WHERE NOT EXISTS(
SELECT auto_id
FROM `table1`
WHERE `table2`.`res_id` = `auto_id`
);
The cleanest way IMHO is an outer join filtering for missing rows:
SELECT t2.*
FROM table2
LEFT JOIN table1 t1 ON t1.auto_id = t2.res_id
WHERE t1.auto_id IS NULL
This works because missed left joins have all nulls in their columns and where clause conditions are applied after the join is made - the IS NULL condition means the only rows returned are those that don't have a matching row in the other table.
As well as being the most efficient (assuming an index on table1.auto_id), it also makes for a briefer query than a NOT IN (...) query.
MySQL JOIN is the best option for you.
Try this:
SELECT *
FROM table2 T2
JOIN table1 T1
ON T2.`res_id` != T1.`auto_id`

I wanted to know the command to check if all the values in one field of a table is present in another table under a different field name

I have 2 tables. I want to find out whether the values present in the first table is there in another table with a different field name.
Here is how it looks,
Table1
BillNo
43529179
43256787
35425676
25467778
24354758
45754748
Table2
BNo
113104808
25426577
268579679
2542135464
252525232
235263663
I have 137 records in table1 that needs to be checked against table2.
Instead of doing it one by one using the following command,
Select * from Table2 where BNo = '43529179';
This gives the result for just the mentioned value. Is there a way to check for all the values in a single query?
Thanks!
You can use a sub-select to compare against:
Select * from Table2 where BNo IN (SELECT BillNo FROM Table1);
That will "evalaute" to something like Select * from Table2 where BNo IN (113104808, 25426577, 268579679, 2542135464, 252525232, ...);
Join the tables, and check how many matching records there are:
select
count(*) as Matches
from
Table1 as t1
inner join Table2 as t2 on t2.BNo = t1.BillNo
You can also use a left join to pick out the records in table 1 that has no matching record in table 2:
select
t1.BillNo
from
Table1 as t1
left join Table2 as t2 on t2.BNo = t1.BillNo
where
t2.BNo is null

SQL Select on multiple tables to check if value exists in one table and not used in other

I have 2 tables:
table1 (id,usedcode)
table2 (codeid,uniquecode)
I want to be able to check if a certain value exists in uniquecode of Table2, but is not already used in Table1
Try using left join as below:
SELECT t2.*
FROM table2 t2 LEFT JOIN table1 t1
ON t2.uniquecode = t1.usedcode
WHERE t1.usedcode IS null
SELECT uniquecode FROM Table2
WHERE NOT EXISTS(
SELECT * FROM Table1 WHERE usedcode = uniquecode
)
In English the query is saying, "Select all unique codes from table 2 that don't exist in table 1 as a usedcode".

SQL: insert only new records

This must be very trivial but I can't seem to find the solution.
I work with two tables, both without any primary key.
I want to add all the records of the first table to the second table only if they don't exist.
Basically:
INSERT INTO Table2
SELECT Table1.*
FROM Table
WHERE "the record to be added doesn't already exists in Table2"
You could do something like this. You would need to check each relevant column - I have just put in 2 as an example. With a Not Exists clause you can check if a record already existed across multiple columns. With a NOT IN you would only be able to check if a record already existed against one column.
INSERT INTO Table2
SELECT t1.*
FROM Table1 t1
WHERE NOT EXISTS
(
SELECT 1
FROM table2 t2 WHERE
t2.col1 = t1.col1 AND
t2.col2 = t1.col2
)
you could make usage of the EXISTS function:
INSERT INTO Table2
SELECT Table1.*
FROM Table1
WHERE NOT EXISTS(SELECT * FROM table2 WHERE <your expression to compare the two tables goes here>)
But i would advise you to check the use of unique index for your tables
Just an idea - untested:
INSERT INTO Table2
SELECT *
FROM Table1
WHERE NOT EXISTS(SELECT * FROM Table2 WHERE Table2.Field1 = Table1.Field1 AND Table2.Field2 = Table1.Field2)
You must add every Field of both Tables in the WHERE clause of the NOT EXISTS Query
INSERT INTO X.TableX1
(ColumX1,ColumnX2)
SELECT DISTINCT c.[ColumnY1],c.[ColumnY2]
FROM Y.Table2 c INNER JOIN Database.z.Table3 i ON c.ColumnX1= i.ColumnY1
WHERE NOT EXISTS
(
SELECT *
FROM X.TableX1 WHERE
X.TableX1.ColumnX1=c.ColumnY1
)
This is Joining two tables and filtering the data required and updating only the new values to third table on every run

MYSQL IN statement with column values from another table

I want to get specific column values from one table and use those values to get information from another table.
I'll use this example: both table1 and table2 contains rows with a "name" column.
I want to select the values of all the "name" columns from table1 meeting conditions and then select rows from table2 which contain any of the names selected from table1. The basic idea is below.
SELECT `name` FROM table1 WHERE...
SELECT `name` FROM table2 WHERE `name` IN(names from the above query)
Hopefully this is clear, thanks.
Just "inject" your first query in the second :
SELECT name FROM table2 WHERE name IN(SELECT name FROM table1 WHERE...)
Apart from the answer from KayKay you can also use EXISTS:
SELECT name FROM table2 t2
WHERE EXISTS( SELECT 1
FROM table t1
WHERE t2.name = t1.name)