13

A と B という 2 つのテーブルがあり、それらを結合したいと考えています。

テーブル A には常にレコードが含まれます。

テーブル B に行がある場合、テーブル A とテーブル B が一致するすべての行をクエリで変換する必要があります。(つまり、内部結合のように動作します)

ただし、テーブル B が空の場合は、テーブル A からすべてを返したいと考えています。

これは1つのクエリで実行できますか?

ありがとう。

4

8 に答える 8

16

はい、このような結果を得るには、 を使用しますLEFT JOIN

基本的INNER JOINには、他のテーブルで少なくとも 1 つの一致がある行のみを返すことです。一方、 は、他のテーブルと一致しないかどうかにかかわらず、左側のテーブルLEFT JOINのすべてのレコードを返します。

結合についてさらに詳しく知りたい場合は、以下のリンクにアクセスしてください。

于 2013-03-07T07:10:23.370 に答える
8

同じ質問に出くわしましたが、回答がなかったので、将来誰かに役立つ場合に備えて、この問題の解決策を別の場所に投稿します。ソースを参照してください。

select *
from TableA as a
left join TableB as b
    on b.A_Id = a.A_Id
where
    b.A_Id is not null or
    not exists (select top 1 A_Id from TableB)
于 2015-05-11T14:46:20.037 に答える
2

これは別のものですが、空の場合はテーブル B に「null」行を 1 つ追加する必要があります

-- In case B is empty
Insert into TableB (col1,col2) values (null,null)

select * 
from TableA as a inner join TableB as b
on 
    b.A_Id = a.A_Id
    or b.A_Id is null
于 2018-09-18T02:42:45.933 に答える
0

私は次のことをしました:

DECLARE @TableB TABLE (id INT)
-- INSERT INTO @TableB
-- VALUES (some ids to filter by)

SELECT TOP 10 *
FROM [TableA]          A
     LEFT JOIN @TableB B
               ON A.ID = B.id
WHERE B.id IS NOT NULL
   OR iif(exists(SELECT *
                 FROM TableB), 1, 0) = 0

ここで、TableB が空の場合 (コメント行をコメントのままにしておく)、トップ 10 を取得します。TableB にいくつかの ID がある場合は、それらによってのみ結合されます。

これがどれほど効率的かはわかりません。コメントは大歓迎です。

于 2020-04-20T17:11:24.010 に答える
0

これを試して

SELECT t1.* FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.something = t2.someotherthing UNION SELECT * FROM table1 WHERE something = somethingelse;
于 2017-09-01T13:11:47.350 に答える