1

私はSQLクエリ、特にロジックを含むものには少し慣れていません。何時間も検索してきましたが、この場合、検索する正確な用語を見つけるのは簡単ではありません。私は比較的単純なものを持っています、私は確信しています:

テーブルには2つの列があり、各行にはプログラム内の関数に関するデータが含まれています。一部の関数には、(グループ化のために)関連付けられた親関数があります。列Aは一意の関数IDです。列Bは、該当する場合、親関数のIDを示します。すべての親機能IDは、列Aの他の場所に存在する独立した有効な機能IDです。

レポートの目的で、親IDでグループ化された関数を一覧表示し、子関数とともに親関数を一覧表示する必要があります。親関数IDで簡単に報告できますが、問題は、列Bが空であるため、親関数が親関数であることを認識しないことです。

私がする必要があるのは、列Bの値が空で、関数が親関数として他の場所で参照されている場合に、その値を完成させることです。

特に明記されていない限り、列BにNULL値がある各行について:

  1. 列Aから値を取得します
  2. 列Bの任意の行にその値が存在するかどうかを確認します
  3. 一致する場合は、値を列Bに挿入します(列AとBが同じ値になるようにします)

私が持っているもの:(クエリSELECT function_id, parent_function FROM functions:)

FUNCTION_ID   PARENT_FUNCTION   
4  
13            4  
79  
138           4
195
314           345
345

私が持っている必要があるもの:

FUNCTION_ID   PARENT_FUNCTION
4             4
13            4
79
138           4
195
314           345
345           345

何か案は?SQLに慣れるのが待ちきれません!よろしくお願いします。

4

3 に答える 3

1

これはあなたのために働くはずです:

UPDATE functions
SET parent_function = function_id
WHERE parent_function IS NULL
AND function_id IN (SELECT parent_function FROM functions)

これは、まだ設定されていない場所、および列のどこかに表示される場所とparent_function同じに設定されます。function_idparent_function

テーブルデータを実際に変更したくないが、それでも必要な値を返す場合は、次のような同様のロジックを使用できます。

SELECT f.function_id, COALESCE(f.parent_function, f2.function_id) as parent_function
FROM functions f
LEFT JOIN functions f2
  ON f.function_id = f2.function_id
  AND f2.function_id IN (SELECT parent_function FROM functions)
于 2012-12-10T16:52:45.997 に答える
0

EXCEPTまたはINTERSECTを使用して2つのテーブルを比較できるかもしれません

http://msdn.microsoft.com/en-us/library/ms188055.aspx

その他のチュートリアル>:

 http://www.mssqltips.com/sqlservertip/1327/compare-sql-server-datasets-with-intersect-and-except/
于 2012-12-10T16:53:19.657 に答える
0

これはどうですか?

select distinct
t1.funx, t1.parent,
case when t2.parent is null then t1.parent
else t2.parent end as newparent
from 
tbl t1 left outer join
tbl t2 on 
t1.funx = t2.parent

sqlFiddle

于 2012-12-10T17:18:50.837 に答える