So I have three tables, table1, table2, and table3. They each have ID fields, table1ID, table2ID, and table3ID respectively. Additionally, table2 has a field table1ID which points to a row in table1, and table3 has a field table2ID which points to a row in table2.
So, my question is, how do I do a select statement that selects only the rows in table3 that reference a row in table2 that reference a row in table1 with the ID 4?
You're looking at a link of joins similar to this
select * from table3
join table2 on table3.table2ID = table2.table2ID
join table1 on table2.table1ID = table1.table1ID
where table1.ID = 4
this will only return table3 records if there is a matching table2 AND table 1 record. The join will filter the results out where the joins match, and the WHERE filter will only select from the results where table1 ID = 4.
A working sample I whipped up (hey I have time to kill)
create table #table1 (table1ID int)
create table #table2 (table2ID int, table1ID int)
create table #table3 (table3ID int, table2ID int)
insert into #table1 values(1)
insert into #table1 values(2)
insert into #table1 values(3)
insert into #table1 values(4)
insert into #table2 values(10, 1)
insert into #table2 values(11, 2)
insert into #table2 values(12, 3)
insert into #table2 values(13, 4)
insert into #table3 values(20, 10)
insert into #table3 values(21, 11)
insert into #table3 values(22, 12)
insert into #table3 values(23, 13)
-- all joined records
select * from #table3
join #table2 on #table3.table2ID = #table2.table2ID
join #table1 on #table2.table1ID = #table1.table1ID
-- only where table1 ID = 4
select * from #table3
join #table2 on #table3.table2ID = #table2.table2ID
join #table1 on #table2.table1ID = #table1.table1ID
where #table1.table1ID = 4
drop table #table1
drop table #table2
drop table #table3
This gives you
table3ID table2ID table2ID table1ID table1ID
----------- ----------- ----------- ----------- -----------
20 10 10 1 1
21 11 11 2 2
22 12 12 3 3
23 13 13 4 4
table3ID table2ID table2ID table1ID table1ID
----------- ----------- ----------- ----------- -----------
23 13 13 4 4
Related
Table 1
ID EXTERNALCODE Brand_T Brand_E Brand_C
1 569859 1 2 3
2 545479 4 2 5
Brands have the same Foreign Key to table 2, they are IDs of table 2.
Table 2
ID Brand_Code
1 eee
2 465656
3 456U99
4 4OREFUOREFJ9
5 r56
FINAL RESULT SHOULD BE:
ID EXTERNALCODE Brand_Code
1 569859 eee
1 569859 465656
1 569859 456U99
2 545479 4OREFUOREFJ9
2 545479 465656
2 545479 r56
What I have tried:
Select
Table1.Id
,Table1.EXTERNALCODE
,Table2.Brand_Code as Brand_Code
,T2_E.Brand_Code as Brand_Code
,T2_C.Brand_Code as Brand_Code
FROM
Table2 Left join Table1 ON Table2.Id = Table1.Brand_T
Table2 Left join Table1 ON Table2.Id = Table1.Brand_E
Table2 Left join Table1 ON Table2.Id = TabLe1.Brand_C
But this query is giving many duplicates.
Since you can't fix the normalization issue you could query against your existing structures something like this.
declare #Table1 table
(
ID int
, EXTERNALCODE int
, Brand_T int
, Brand_E int
, Brand_C int
)
insert #Table1 values
(1, 569859, 1, 2, 3)
, (2, 545479, 4, 2, 5)
declare #Table2 table
(
ID int
, Brand_Code varchar(50)
)
insert #Table2 values
(1, 'eee')
, (2, '465656')
, (3, '456U99')
, (4, '4OREFUOREFJ9')
, (5, 'r56')
select t1.Id
, t1.EXTERNALCODE
, t2.Brand_Code
from #Table1 t1
join #Table2 t2 ON t2.ID in (t1.Brand_T, t1.Brand_E, t1.Brand_C)
I have two tables, Table1 contains master records and Table2 contains details.
How I can get all records in Table1 that hit all details in Table2
CREATE Table1 ([ID] INT , [Title] VARCHAR(256))
CREATE Table2 ([ID] INT, [Table1_ID] INT, [Detail] INT)
Sample:
Table1:
ID Title
---------------
1 Data_1
2 Data_2
3 Data_3
Table2
ID Table1_ID Detail
-------------------------------
1 1 500
2 1 600
3 2 500
4 3 500
5 3 600
I need to this result:
Result:
Table1_ID Table1_Title
----------------------
1 Data_1
3 Data_3
I'm looking for a way with best performance.
This is basic inner join example:
select Table1.ID, Title
from Table1
inner join Table2 on Table1.ID = Table2.Table1_ID
An INNER JOIN between the two tables will get you the results that exist in both tables, so :
SELECT
T1.ID, T1.Title
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.Table1_ID
Would get you all the records from the tables were the ID from Table1 is in Table2
There's a splendid post HERE which explains the different types of joins
Here you go:
DECLARE #T1 TABLE (ID INT, Title VARCHAR(256));
DECLARE #T2 TABLE (ID INT, Table1_ID INT, Detail INT);
INSERT INTO #T1 VALUES
(1,'Data_1'),
(2,'Data_2'),
(3,'Data_3');
INSERT INTO #T2 VALUES
(1,1,500),
(2,1,600),
(3,2,500),
(4,3,500),
(6,3,600);
SELECT T1.ID Table1_ID, T1.Title Table1_Title
FROM #T1 T1 INNER JOIN #T2 T2 ON T1.ID = T2.ID
WHERE T1.ID IN (1,3);
Output:
+-----------+--------------+
| Table1_ID | Table1_Title |
+-----------+--------------+
| 1 | Data_1 |
| 3 | Data_3 |
+-----------+--------------+
Demo.
I found this solution I am not sure if it is the best way to do this?
DECLARE #T1 TABLE ([ID] INT, [Title] VARCHAR(256));
DECLARE #T2 TABLE ([ID] INT, [Table1_ID] INT, [Detail] INT);
INSERT INTO #T1
VALUES
(1, 'Data_1'),
(2, 'Data_2'),
(3, 'Data_3');
INSERT INTO #T2
VALUES
(1, 1, 500),
(2, 1, 600),
(3, 2, 500),
(4, 3, 500),
(5, 3, 600);
DECLARE #DetailCount INT
SELECT #DetailCount = COUNT(DISTINCT [Detail]) FROM #T2
SELECT
T1.[ID] [Table1_ID],
T1.[Title] [Table1_Title]
FROM
#T1 T1 INNER JOIN
#T2 T2 ON T1.[ID] = T2.[Table1_ID]
GROUP BY
T1.[ID],
T1.[Title]
HAVING
COUNT(T2.[Detail]) = #DetailCount
I have two SQL tables (I am using SQLite).
Table1 (code TEXT)
Table2 (code TEXT, codeTable1 TEXT)
How can I fetch all the table1's content which has at least one row in the table 2 with the codeTable1 not null?
I think you want a correlated subquery:
select t1.*
from Table1 t1
where exists (select 1
from Table2 t2
where t2.code = t1.code and t2.codeTable1 is not null
);
This seems like a pretty direct translation of your requirements.
select
a.*
from
Table1 a
where
exists (select * from Table2 b where b.codeTable1 is not null)
or
select
a.*
from
Table1 a
where
exists (select * from Table2 b where b.codeTable1 = a.code)
Not sure exactly the purpose of your query.
A simple join should do it:
Here's the query:
select
*
from
table1
join table2 on table1.code = table2.table1_code
where
table1.code is not null
Here's the full example:
use example;
drop table if exists table1;
drop table if exists table2;
create table table1 (
code varchar(64)
);
create table table2 (
code varchar(64),
table1_code varchar(64) references table1(code)
);
insert into table1 values('CODE1');
insert into table1 values('CODE2');
insert into table1 values('CODE3');
insert into table1 values('CODE4');
insert into table1 values('CODE5');
insert into table1 values(null);
insert into table2 values('VAL1', 'CODE1');
insert into table2 values('VAL3', 'CODE3');
insert into table2 values('VAL5', 'CODE5');
insert into table2 values(null, null);
insert into table2 values(null, null);
insert into table2 values(null, null);
select
*
from
table1
join table2 on table1.code = table2.table1_code
where
table1.code is not null
+ --------- + --------- + ---------------- +
| code | code | table1_code |
+ --------- + --------- + ---------------- +
| CODE1 | VAL1 | CODE1 |
| CODE3 | VAL3 | CODE3 |
| CODE5 | VAL5 | CODE5 |
+ --------- + --------- + ---------------- +
3 rows
I'm Working with Sql server 2008 i have two tables and one reference table.table1 contains ,
Id Name test1 test2
1 sss started processing
2 asdfasd started processing
table 2 contains,
Id Name test1 test2
1 sss 2 2
2 asdfasd 3 2
reference table has ,
code Name
1 Started
2 processing
3 stopped
i have to write update query to change the table 2 values as following,
Id Name test1 test2
1 sss 1 2
2 asdfasd 1 2
how to write update query for the above scenario?
Please find example below.
You can do this in one UPDATE
DECLARE #table1 Table (ID INT, NAME VARCHAR(100), test1 VARCHAR(100), test2 VARCHAR(100))
INSERT INTO #table1 SELECT 1, 'sss', 'started', 'processing'
INSERT INTO #table1 SELECT 2, 'asdfasd', 'started', 'processing'
DECLARE #table2 Table (ID INT, NAME VARCHAR(100), test1 INT, test2 INT)
INSERT INTO #table2 SELECT 1, 'sss', 2, 2
INSERT INTO #table2 SELECT 2, 'asdfasd', 3, 2
DECLARE #refTable Table (CODE INT, NAME VARCHAR(100))
INSERT INTO #refTable SELECT 1, 'Started'
INSERT INTO #refTable SELECT 2, 'processing'
INSERT INTO #refTable SELECT 3, 'stopped'
UPDATE T2
SET test1 = R1.Code,
test2 = R2.Code
FROM #table2 T2
INNER JOIN #table1 T1
ON T1.ID = T2.ID
INNER JOIN #refTable R1
ON T1.test1 = R1.Name
INNER JOIN #refTable R2
ON T1.test2 = R2.Name
SELECT *
FROM #table2
I have two tables with same column name I have to add the oprId column values for some specific condition on both tables.
Table 1
something oprId
abc 1
qwe 2
Table 2
something oprId
abc 2
qwe 5
Result should be
oprId
3
7
declare #T1 table (something varchar(3), oprId int)
declare #T2 table (something varchar(3), oprId int)
insert into #T1 values ('abc', 1),('qwe', 2)
insert into #T2 values ('abc', 2),('qwe', 5)
select T1.oprId+T2.oprId as oprId
from #T1 as T1
inner join #T2 as T2
on T1.something = T2.something
Result:
oprId
------
3
7
SELECT ISNULL(A.something,B.something) Something,
ISNULL(A.oprId,0)ÍSNULL(B.oprId,0) oprId
FROM Table1 A
FULL JOIN Table2 B
ON A.something = B.something