2017-11-21 2 views
0

ich die folgende Abfrage haben zu prüfen, ob Benutzernamen genau das gleiche zwischen TabellenVergleichen Identische Spalten von 2 Verschiedene Tabelle für Mismatch Daten

SELECT 
    --Username 
    a.username as 'TABLE_1_USERNAME', 
    b.username as 'TABLE_2_USERNAME', 
    CASE 
     WHEN a.username IS NULL AND b.username IS NULL THEN 'True' 
     WHEN a.username = b.username THEN 'True' 
     ELSE 'False' 
    END AS 'Is Equal?' 
    FROM User a 
JOIN User_Group b ON a.id = b.id 

Dies funktioniert gut sind mir zu sagen, wenn Benutzernamen aus irgendeinem Grund unterscheiden, aber Was ich tun möchte, ist rekursiv jede Spalte zwischen der User Tabelle und der User_Group Tabelle zu vergleichen (ohne jedes zu schreiben) - beide Spaltennamen der Tabelle sind identisch. Ist das in SQL Server möglich?

Gehäuse Kontrollen Weglassen und Trimmen der Kürze

+0

, dass "t Arbeit zu gewonnen, wenn es einen Fall empfindlich, ich würde verwenden' UPPER() ' – Sami

+0

@Sami Ich bin mir bewusst, danke! –

+0

haben die beiden Tabellen die gleiche Struktur? – SEarle1986

Antwort

0

bereits. Except zeigt alle Zeilen in den beiden Abfragen, die nicht in vollem Umfang

SELECT * FROM User_Group 
EXCEPT 
SELECT * FROM User 
0

Hier ist eine dynamische SQL-Methode zu tun wahrsten Sinne des Wortes, was Sie fragen für Match:

DECLARE @cols TABLE (id int identity(1,1), colname varchar(25)) 
INSERT INTO @cols (colname) select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'User' AND COLUMN_NAME <> 'id' 

declare @sql nvarchar(max) 
select @sql = 'SELECT a.id, ' 
declare @maxval int 
select @maxval = max(id) from @cols 
declare @c int = 1 
declare @curcol varchar(25) 

while @c <= @maxval 
begin 
    if @c > 1 
     select @sql += ', ' 

    select @curcol = colname from @cols where id = @c 
    select @sql += 'a.' + @curcol + ' as ''Table_1_' + @curcol + ''', b.' + @curcol + ' as ''Table_2_' + @curcol + ''', 
    CASE 
     WHEN a.' + @curcol + ' IS NULL AND b.' + @curcol + ' IS NULL THEN ''True'' 
     WHEN a.' + @curcol + ' = b.' + @curcol + ' THEN ''True'' 
     ELSE ''False'' 
    END AS ''Is Equal?''' 

    set @c = @c + 1 
end 

select @sql += 'FROM [User] a 
INNER JOIN User_Group b ON a.id = b.id' 

exec sp_executesql @sql 

Mit dem folgenden Testdaten:

create table [User] (id int, username varchar(10), fname varchar(25), lname varchar(25)) 
create table [User_Group] (id int, username varchar(10), fname varchar(25), lname varchar(25)) 

insert into [User] values (1, 'user1', 'fname1', 'lname1') 
insert into [User_Group] values (1, 'user1', 'fname1', 'lname1') 
insert into [User] values (2, 'user2', 'fname2', 'lname2') 
insert into [User_Group] values (2, 'user2', 'fnameasdf', 'lnamesdfg') 

Es erzeugt diese Ausgabe:

id Table_1_username Table_2_username Is Equal? Table_1_fname Table_2_fname Is Equal? Table_1_lname Table_2_lname Is Equal? 
1 user1    user1    True  fname1   fname1   True  lname1   lname1   True 
2 user2    user2    True  fname2   fnameasdf  False  lname2   lnamesdfg  False 
Hier

ist die Abfrage erzeugt sie:

SELECT a.id, a.username as 'Table_1_username', b.username as 'Table_2_username', 
    CASE 
     WHEN a.username IS NULL AND b.username IS NULL THEN 'True' 
     WHEN a.username = b.username THEN 'True' 
     ELSE 'False' 
    END AS 'Is Equal?', a.fname as 'Table_1_fname', b.fname as 'Table_2_fname', 
    CASE 
     WHEN a.fname IS NULL AND b.fname IS NULL THEN 'True' 
     WHEN a.fname = b.fname THEN 'True' 
     ELSE 'False' 
    END AS 'Is Equal?', a.lname as 'Table_1_lname', b.lname as 'Table_2_lname', 
    CASE 
     WHEN a.lname IS NULL AND b.lname IS NULL THEN 'True' 
     WHEN a.lname = b.lname THEN 'True' 
     ELSE 'False' 
    END AS 'Is Equal?'FROM [User] a 
INNER JOIN User_Group b ON a.id = b.id 
Verwandte Themen