1

:TABLE1と表2は、同様のデータを構成されている場合データ比較の問題

select @table1 as DataState, * from 
(select * from importedcsvclients 
except 
select * from tblClients) x 
union all 
select @table2 as DataState, * from 
(select * from tblClients 
except select * 
from importedcsvclients) x 

上記のコードは正常に動作しますが、しかし、両方のレコードが表示されます。

誰でもとしてクエリを動作させるために私を助けることができます:

はTABLE1とtable2の両方の結果を得るが、同じ名前がTABLE1に存在しない場合のみ、table2のデータを示しています。

ありがとうございました。情報については

EXCEPTを使用する

table1 
ID Name 
1 TestA 
2 TestB  
3 TestC 
4 TestD 

table2 
ID Name 
1 TestE 
2 TestF  
3 TestG 
4 TestD 

Results: 
Name  DataState 
TestA table1 
TestB table1 
TestC table1 
TestD table1 
TestE table2 
TestF table2 
TestG table2 
+0

「テーブル1にデータが存在するかどうかを表示する」とは、単にIDまたは名前ですか? –

+0

私はあなたがその反対を意味すると思う(少なくともあなたの結果が示すもの)。 「名前がtable1に存在しない場合は、table2データのみを表示する」という意味ではありませんか? Test2のtable2のコピーを結果から除外しました。 –

+0

こんにちはアーロン、test2からtable2が表示されていません。結果には、TestA、TestB、TestC、TestD、table2からTestE、TestF、TestGが必要です。ありがとう。 – kyusan93

答えて

0

私は以下を使用しました。 ありがとうございました。

DECLARE @sql VARCHAR(8000) 
SET @sql = 'SELECT ''' + @table1 + ''' AS DataState, * FROM 
(SELECT ' + @columnlist + ' FROM ' + @table1 + ' 
    EXCEPT 
SELECT ' + @columnlist + ' FROM ' + @table2 + ') x 
    UNION 
SELECT ''' + @table2 + ''' AS DataState, * from 
    (SELECT ' + @columnlist + ' FROM ' + @table2 + ' 
     INTERSECT 
    SELECT ' + @columnlist + ' FROM ' + @table1 +') x' 

EXEC(@sql) 
3

非常に魅力的なていますが、少し複雑で何から適切な結果を得るために、いつものように簡単ではないことがわかりましたと。ここでは、CTEを使用して後にしている結果で試みです:

DECLARE @table1 TABLE(ID INT, Name VARCHAR(32));  
INSERT @table1 VALUES (1,'TestA'), (2,'TestB'), (3,'TestC'), (4,'TestD'); 

DECLARE @table2 TABLE(ID INT, Name VARCHAR(32)); 
INSERT @table2 VALUES (1,'TestE'), (2,'TestF'), (3,'TestG'), (4,'TestD'); 

;WITH x AS 
(
    SELECT m, Name, rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY m) 
    FROM 
    (
    SELECT m = 'table1', Name FROM @table1 
    UNION ALL 
    SELECT m = 'table2', Name FROM @table2 
) AS y 
) 
SELECT Name, DataState = m 
    FROM x 
    WHERE rn = 1 
    ORDER BY Name; 

結果:(pesudo)で

Name  DataState 
--------- --------- 
TestA  table1 
TestB  table1 
TestC  table1 
TestD  table1 
TestE  table2 
TestF  table2 
TestG  table2 
+0

作品素晴らしい... Btw、私は列 'm'は、クエリを実行するときに 'm'を表示しているように削除することができます。 – kyusan93

+1

最終的なSELECTリストをSELECT *に変更していない限りは、そうしてはいけません。 –

+0

私は参照してください。 TestDの代わりにtable2を表示すると、どうすればtable1として表示することができますか?ありがとう。 – kyusan93

0

関係代数:TSQLで

table1 UNION (table2 NOT MATCH table1) 

DataStateを追加) :

SELECT ID, Name, 
     'table1' AS DataState 
    FROM table1 
UNION 
SELECT ID, Name, 
     'table2' AS DataState 
    FROM table2 
WHERE Name NOT IN (SELECT Name FROM table1); 

サンプルデータのテストデータを含める:

WITH table1 
    AS 
    (
     SELECT * 
     FROM (
       VALUES (1, 'TestA'), 
        (2, 'TestB'),  
        (3, 'TestC'), 
        (4, 'TestD') 
      ) AS T (ID, Name) 
    ), 
    table2 
    AS 
    (
     SELECT * 
     FROM (
       VALUES (1, 'TestE'), 
        (2, 'TestF'),  
        (3, 'TestG'), 
        (4, 'TestD') 
      ) AS T (ID, Name) 
    ) 
SELECT ID, Name, 
     'table1' AS DataState 
    FROM table1 
UNION 
SELECT ID, Name, 
     'table2' AS DataState 
    FROM table2 
WHERE Name NOT IN (SELECT Name FROM table1);