1

以下のSQLクエリがあります:

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 の両方の結果を取得しますが、同じ名前が table1 に存在しない場合は table2 のデータのみを表示します。

ありがとう。

情報:

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
4

3 に答える 3

3

非常に使いたくなりますEXCEPTが、おわかりのように、少し複雑なものから適切な結果を得るのは必ずしも簡単ではありません。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;

結果:

Name        DataState
---------   ---------
TestA       table1
TestB       table1
TestC       table1
TestD       table1
TestE       table2
TestF       table2
TestG       table2
于 2012-04-26T03:04:53.253 に答える
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) 
于 2012-04-27T16:06:51.107 に答える
0

(疑似) 関係代数では:

table1 UNION ( table2 NOT MATCH table1 )

TSQL で (追加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 );
于 2012-04-26T07:45:21.737 に答える