0

同じ sql-server データベースに、2 つの連続した四半期のアプリケーション名とユーザー名 (とりわけ) を格納する 2 つのテーブルがあります。私が欲しいのは、テーブル B にないテーブル A のユーザーとその逆を示す完全な結合です。

編集: table_a と table_b の両方に、AppName と Username が同じ値を持つ 2 つ以上のレコードが含まれているため、DISTINCT が必要になります。これを反映するために、以下の例を編集しました。

テーブル a:

-----------------------
| AppName  | Username |
-----------------------
| app1     | jdoe     |
| app1     | jsmith   |
| app1     | jdoe     |
| app2     | jsmith   |
-----------------------

テーブル_b:

-----------------------
| AppName  | Username |
-----------------------
| app1     | fbar     |
| app1     | jsmith   |
| app1     | jboehner |
| app1     | fbar     |
| app3     | jboehner |
-----------------------

SQL:

SELECT DISTINCT a.username as q2, b.username as q3
FROM tablea as a
FULL JOIN tableb as b
ON a.username = b.username
WHERE a.appname = 'app1'
AND b.appname = 'app1'

期待される結果:

-----------------------
| q2       | q3       |
-----------------------
| jdoe     |          |
| jsmith   | jsmith   |
|          | fbar     |
-----------------------
|          | jboehner |
-----------------------

実結果:

-----------------------
| q2       | q3       |
-----------------------
| jsmith   | jsmith   |
-----------------------

何を与える??

4

3 に答える 3

4

OUTER JOIN されたテーブル (この場合は両方のテーブル) で WHERE 句を使用すると、フィルターが結合の結果に適用され、すべての条件が満たされる必要があるため、INNER JOIN に変更されます。あなたの場合、一致する行を除いてこれは不可能です(INNER JOINに強制します)。これがあなたの意図したものだと思います:

SELECT DISTINCT a.username as q2, b.username as q3
FROM dbo.tablea as a
FULL OUTER JOIN dbo.tableb as b
ON a.username = b.username
AND (a.appname = b.appname)
WHERE a.appname = 'app1' OR b.appname = 'app1';

-- or

SELECT DISTINCT a.username as q2, b.username as q3
FROM dbo.tablea as a
FULL OUTER JOIN dbo.tableb as b
ON a.username = b.username
AND (a.appname = b.appname)
WHERE 'app1' IN (a.appname, b.appname);
于 2013-10-09T18:13:37.400 に答える
-3

where は単にあるべきかどうかと: WHERE a.appname = 'app1' OR b.appname = 'app1'

于 2013-10-09T18:30:03.580 に答える