A と B という 2 つのテーブルがあり、それらを結合したいと考えています。
テーブル A には常にレコードが含まれます。
テーブル B に行がある場合、テーブル A とテーブル B が一致するすべての行をクエリで変換する必要があります。(つまり、内部結合のように動作します)
ただし、テーブル B が空の場合は、テーブル A からすべてを返したいと考えています。
これは1つのクエリで実行できますか?
ありがとう。
A と B という 2 つのテーブルがあり、それらを結合したいと考えています。
テーブル A には常にレコードが含まれます。
テーブル B に行がある場合、テーブル A とテーブル B が一致するすべての行をクエリで変換する必要があります。(つまり、内部結合のように動作します)
ただし、テーブル B が空の場合は、テーブル A からすべてを返したいと考えています。
これは1つのクエリで実行できますか?
ありがとう。
はい、このような結果を得るには、 を使用しますLEFT JOIN
。
基本的INNER JOIN
には、他のテーブルで少なくとも 1 つの一致がある行のみを返すことです。一方、 は、他のテーブルと一致しないかどうかにかかわらず、左側のテーブルLEFT JOIN
のすべてのレコードを返します。
結合についてさらに詳しく知りたい場合は、以下のリンクにアクセスしてください。
同じ質問に出くわしましたが、回答がなかったので、将来誰かに役立つ場合に備えて、この問題の解決策を別の場所に投稿します。ソースを参照してください。
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)
これは別のものですが、空の場合はテーブル 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
私は次のことをしました:
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 がある場合は、それらによってのみ結合されます。
これがどれほど効率的かはわかりません。コメントは大歓迎です。
これを試して
SELECT t1.* FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.something = t2.someotherthing UNION SELECT * FROM table1 WHERE something = somethingelse;