如果任何其他列字段更改,如何从具有相同主键的两个表返回记录 [英] How to get the records back from two tables with same primary key if any of the other column fields are changed

查看:108
本文介绍了如果任何其他列字段更改,如何从具有相同主键的两个表返回记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以前的问题很混乱。我很抱歉我的粗心。在这里,我再次发布我的问题与更多的信息。



我的表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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆