1

状況:

Table1: id, 
Table2: id, table1_id
Table3: id, table2_id
user: id, table1_id (can be null), table2_id(can be null), table3_id(can be null)

Table1、Table2、Table3 は階層構造を形成します (単一の table1 行の場合、Table2 に多くの行があり、単一の Table2 行の場合、Table3 に多くの行があります)。

選択したユーザーに割り当てられた Table3 からレコードを選択する必要があります。割り当て済みとは、ユーザー レコードの ID が一致する (table1_id = Table1.id AND table2_id = Table2.id AND table3_id = Table3.id) ことを意味します。ただし、ユーザー レコードの値が null の場合、対応するテーブルのすべてのレコードにユーザーが割り当てられていることを意味します。

if table1_id = null query should return all rows
elif table2_id = null query should return all rows where (table1_id = Table1.id)
elif table3_id = null query should return all rows where (table1_id = Table1.id AND table2_id = Table2.id 
elif query should return all rows where (table1_id = Table1.id AND table2_id = Table2.id AND table3_id = Table3.id)

私の提案:

declare @table1_id int
declare @table2_id int
declare @table3_id int

select @table1_id = table1_id, @table2_id = @table2_id, @table3_id = @table3_id 
from user where id = 5 (5 is parmeter)

select * from Table3 where
(@table1_id IS NULL OR @table1_id = 
       (select table1_id from Table2 where Table2.id = Table3.table2_id)) AND
(@table2_id IS NULL OR @table2_id = Table3.table2_id) AND
(@table3_id IS NULL OR @table3_id = Table3.id) 

それは良いSQLクエリですか?もっと上手にできますか

4

1 に答える 1

1

これをすべて1つのクエリにまとめることができます。

select table3.*
from table3 cross join
     (select table1_id, table2_id, table3_id 
      from user
      where id = 5
     ) const
where (const.table1_id is null or const.table1_id in (select table1_id from table2 where table2.id = table3.table2_id)) and
      (const.table2_id is null or const.table2_id = table3.table2_id) and
      (const.table3_id is null or const.table3_id = table3.id)

副選択から複数のリターンが得られる可能性があるため、=をに置き換えました。in

明示的な結合を使用して、これを表現する他の方法があります。ただし、テーブル間の関係によっては、行が重複する可能性があります。

于 2013-03-20T13:19:07.893 に答える