如果任何其他列字段更改,如何从具有相同主键的两个表返回记录 [英] How to get the records back from two tables with same primary key if any of the other column fields are changed
问题描述
我以前的问题很混乱。我很抱歉我的粗心。在这里,我再次发布我的问题与更多的信息。
我的表A和表B有相同的列名称(名称,ID,年龄,日期,类,... )但行数不同。表B是表A的重复表,并且行数较少。我想知道的是如何检索记录,如果他们有相同的主键(id)和任何其他列字段(名称,年龄,日期,类,...)是不同的。但是,有一个条件。虽然记录具有相同的主键,但如果仅更改日期,则不应检索记录。仅当两个表具有相同主键,日期不同且任何列字段更改时,都应检索记录。 p>
由于有大约20万条记录,大约100列,我想使用高级SQL,因为如果我使用 Select,我的SQL将会太长.. from ... where
,但我不知道使用哪个SQL。
TableA
:
名称年龄ID日期
------ --- - ---------
David 11 1 11/01/2014
Claire 16 2 13/03/2014
Max 15 3 20/02/2014
John 14 4 19/09/2014
James 12 5 16/06/2014
TableB
:
name age id date
----- --- - ----------
Max 15 3 15/05/2014
Will 14 4 12/04/2014
Bill 12 7 11/04 / 2014
Paul 11 8 24/12/2013
Kevin 13 9 03/04/2014
预期输出:
TableA TableB
name age id date name age id date
---- --- - ---------- ---- --- - ----------
John 14 4 19 / 09/2014 Will 14 4 12/04/2014
感谢!
因为你想检查所有列写一个where子句,它可能很乏味,所以你可以使用 information_schema。 columns
以获取该表的列名称,然后使用动态查询可以检查列差异。
以下可能是您问题的解决方案。
- 模拟表结构
CREATE TABLE TableA
(
NAME VARCHAR(100),
AGE INT,
ID INT,
DATE_COL DATETIME
)
CREATE TABLE TableB
(
NAME VARCHAR(100),
AGE INT,
ID INT,
DATE_COL DATETIME
)
- 测试数据
INSERT INTO TABLEA(NAME,AGE,ID,DATE_COL)VALUES('David',11,1,'01 / 11/2014')
INSERT INTO TABLEA(NAME,AGE,ID,DATE_COL)VALUES('Claire',16,2,'03 / 13/2014')
INSERT INTO TABLEA(NAME,AGE,ID,DATE_COL) VALUES('Max',15,3,'02 / 20/2014')
INSERT INTO TABLEA(NAME,AGE,ID,DATE_COL)VALUES('John',14,4,'09 / 19/2014 ')
INSERT INTO TABLEA(NAME,AGE,ID,DATE_COL)VALUES('James',12,5,'06 / 16/2014')
INSERT INTO TABLEB AGE,ID,DATE_COL)VALUES('Max',15,3,'05 / 15/2014')
INSERT INTO TABLEB(NAME,AGE,ID,DATE_COL)VALUES('Will',14,4, '04 / 12/2014')
INSERT INTO TABLEB(NAME,AGE,ID,DATE_COL)VALUES('Bill',12,7,'04 / 11/2014')
INSERT INTO TABLEB NAME,AGE,ID,DATE_COL)VALUES('Paul',11,8,'12 / 24/2013')
INSERT INTO TABLEB(NAME,AGE,ID,DATE_COL)VALUES('Kevin',13, 9,'04 / 03/2014')
- 解决方案从这里开始
CREATE TABLE #TableCols
(
ID INT IDENTITY ,1),
COLUMN_NAME VARCHAR(1000)
)
- 因为两个表都有相同的列,你可以取任何1个表的列
INSERT INTO #TableCols
(COLUMN_NAME)
SELECT COLUMN_NAME
FROM information_schema.columns
WHERE table_name ='TableA';
DECLARE @STARTCOUNT INT,@MAXCOUNT INT,@COL_NAME VARCHAR(1000),@QUERY VARCHAR(8000),@SUBQUERY VARCHAR(8000)
SELECT @STARTCOUNT = 1 ,@MAXCOUNT = MAX(ID)FROM #TableCols;
SELECT @QUERY ='',@SUBQUERY =''
WHILE(@STARTCOUNT <= @MAXCOUNT)
BEGIN
SELECT @COL_NAME = COLUMN_NAME FROM# TableCols WHERE ID = @STARTCOUNT;
IF(@COL_NAME!='DATE_COL'AND @COL_NAME!='ID')
BEGIN
SET @SUBQUERY = @SUBQUERY +'A'+ @COL_NAME + '!= B.'+ @COL_NAME +'OR';
END
SET @STARTCOUNT = @STARTCOUNT + 1
END
SET @SUBQUERY = LEFT(@SUBQUERY,LEN(@SUBQUERY) - 3 );
SET @QUERY ='SELECT A. *,B. * FROM TableA A INNER JOIN TableB B ON A.ID = B.ID WHERE A.DATE_COL!= B.DATE_COL AND('+ @SUBQUERY +') ';
EXEC(@QUERY);
希望这有帮助。
My previous question is very confusing. I am so sorry for my carelessness. Here, I posted my question again with more information.
My table A and table B has same column names(name,id,age,date,class,...) but different number of rows. Table B is a duplicate table of table A and has fewer rows. What I want to know is how I can retrieve the records if they have the same primary key(id) and any of the other column fields (name, age, date, class,...) are different. However, there is one condition. Although the records have same primary key, if only date is changed, records should not be retrieved.Only when the two tables have same primary key, date is different and any of the column fields is changed, the records should be retrieved.
Since there are around 200k records, and around 100 columns, I would like to use advanced SQL, since my SQL will be too long if I use Select.. from... where
, but I don't know which SQL to use.
TableA
:
name age id date
------ --- -- ----------
David 11 1 11/01/2014
Claire 16 2 13/03/2014
Max 15 3 20/02/2014
John 14 4 19/09/2014
James 12 5 16/06/2014
TableB
:
name age id date
----- --- -- ----------
Max 15 3 15/05/2014
Will 14 4 12/04/2014
Bill 12 7 11/04/2014
Paul 11 8 24/12/2013
Kevin 13 9 03/04/2014
Output expected:
TableA TableB
name age id date name age id date
---- --- -- ---------- ---- --- -- ----------
John 14 4 19/09/2014 Will 14 4 12/04/2014
Thanks!
Since you want to check for all columns writing a where clause for it might be tedious so you can use information_schema.columns
to get the column names for that table and then using a dynamic query you can check for column differences.
The following might be the solution to your problem.
--Simulate your table structure
CREATE TABLE TableA
(
NAME VARCHAR(100),
AGE INT,
ID INT,
DATE_COL DATETIME
)
CREATE TABLE TableB
(
NAME VARCHAR(100),
AGE INT,
ID INT,
DATE_COL DATETIME
)
--Data for testing
INSERT INTO TABLEA(NAME, AGE, ID, DATE_COL) VALUES('David',11,1,'01/11/2014')
INSERT INTO TABLEA(NAME, AGE, ID, DATE_COL) VALUES('Claire',16,2,'03/13/2014')
INSERT INTO TABLEA(NAME, AGE, ID, DATE_COL) VALUES('Max',15,3,'02/20/2014')
INSERT INTO TABLEA(NAME, AGE, ID, DATE_COL) VALUES('John',14,4,'09/19/2014')
INSERT INTO TABLEA(NAME, AGE, ID, DATE_COL) VALUES('James',12,5,'06/16/2014')
INSERT INTO TABLEB(NAME, AGE, ID, DATE_COL) VALUES('Max',15,3,'05/15/2014')
INSERT INTO TABLEB(NAME, AGE, ID, DATE_COL) VALUES('Will',14,4,'04/12/2014')
INSERT INTO TABLEB(NAME, AGE, ID, DATE_COL) VALUES('Bill',12,7,'04/11/2014')
INSERT INTO TABLEB(NAME, AGE, ID, DATE_COL) VALUES('Paul',11,8,'12/24/2013')
INSERT INTO TABLEB(NAME, AGE, ID, DATE_COL) VALUES('Kevin',13,9,'04/03/2014')
--Solution Starts from here
CREATE TABLE #TableCols
(
ID INT IDENTITY(1,1),
COLUMN_NAME VARCHAR(1000)
)
--since both tables have same columns you can take columns of any 1 table
INSERT INTO #TableCols
(COLUMN_NAME)
SELECT COLUMN_NAME
FROM information_schema.columns
WHERE table_name = 'TableA';
DECLARE @STARTCOUNT INT, @MAXCOUNT INT, @COL_NAME VARCHAR(1000), @QUERY VARCHAR(8000), @SUBQUERY VARCHAR(8000)
SELECT @STARTCOUNT = 1, @MAXCOUNT = MAX(ID) FROM #TableCols;
SELECT @QUERY = '', @SUBQUERY = ''
WHILE(@STARTCOUNT <= @MAXCOUNT)
BEGIN
SELECT @COL_NAME = COLUMN_NAME FROM #TableCols WHERE ID = @STARTCOUNT;
IF(@COL_NAME != 'DATE_COL' AND @COL_NAME != 'ID')
BEGIN
SET @SUBQUERY = @SUBQUERY + ' A.' + @COL_NAME + ' != B.' + @COL_NAME + ' OR ';
END
SET @STARTCOUNT = @STARTCOUNT + 1
END
SET @SUBQUERY = LEFT(@SUBQUERY, LEN(@SUBQUERY) - 3);
SET @QUERY = 'SELECT A.*, B.* FROM TableA A INNER JOIN TableB B ON A.ID = B.ID WHERE A.DATE_COL != B.DATE_COL AND (' + @SUBQUERY + ')';
EXEC (@QUERY);
Hope this helps.
这篇关于如果任何其他列字段更改,如何从具有相同主键的两个表返回记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!