Sybaseの特定のテーブルへの外部キーを持つ任意のテーブルのテーブル/列名を選択するSQLステートメント(できれば)を探しています。 sys...
テーブルですが、sybaseはまったく新しいので、頭も足指も作れません。ですから、正しい方向への助けは高く評価されます。
編集:完全を期すために:SELECT @@VERSION
戻り値
「Adaptive Server Enterprise/15.0.3/EBF 17156 ESD#3/P/Sun_svr4/OS 5.8/ase1503/2726/64-bit/FBO/Fri Feb 5 05:26:23 2010」
編集2
あなたの提案、特にAndrew Bickertonのコメントに感謝します。これにより、出発点としてさらに先に進むための基本的なSQL selectステートメントを作成できました。
他の誰かがそれに興味がある場合は、ここにあります:
select
fko.name "Foreign key name",
par.name "Referenced table name",
fk1.name || ' -> ' || pk1.name "Reference 1",
fk2.name || ' -> ' || pk2.name "Reference 2",
fk3.name || ' -> ' || pk3.name "Reference 3",
fk4.name || ' -> ' || pk4.name "Reference 4"
from
sysobjects tab join
sysconstraints con on tab.id = con.tableid join
sysobjects fko on con.constrid = fko.id join
sysreferences ref on con.constrid = ref.constrid join
sysobjects par on par.id = ref.reftabid left join
---- 1. Column
syscolumns fk1 on ref.fokey1 = fk1.colid and
ref.tableid = fk1.id left join
syscolumns pk1 on ref.refkey1 = pk1.colid and
ref.reftabid = pk1.id left join
---- 2. Column
syscolumns fk2 on ref.fokey2 = fk2.colid and
ref.tableid = fk2.id left join
syscolumns pk2 on ref.refkey2 = pk2.colid and
ref.reftabid = pk2.id left join
---- 3. Column
syscolumns fk3 on ref.fokey3 = fk3.colid and
ref.tableid = fk3.id left join
syscolumns pk3 on ref.refkey3 = pk3.colid and
ref.reftabid = pk3.id left join
---- 4. Column
syscolumns fk4 on ref.fokey4 = fk4.colid and
ref.tableid = fk4.id left join
syscolumns pk4 on ref.refkey4 = pk4.colid and
ref.reftabid = pk4.id -- Et cetera...
where
tab.type = 'U' and
tab.name = 'tq84_f' and
fko.type = 'RI'
私はsybaseで作業してからしばらく経ちましたが、(メモリから)次のSQLは正しい方向を示しているはずです。
select *
from sysobjects so inner join syscolumns sc on so.id = sc.id
where sc.name = 'field name'
オンラインのsybaseブック(システムテーブル) も確認できます。
別のアプローチは「sp_depends」です
Sybase URL: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sprocs/html/sprocs/sprocs68.htm
上記のアプローチ(sysconstraintsとsysreferencesを使用)は、参照制約がある場合にのみ機能することに注意してください。外部キーだけが定義されていて、制約がない場合、そこには表示されません。特定のテーブルに関連するすべての外部キーを取得するには、syskeysを使用できます。
select rtrim(object_name(k.id)),
rtrim(substring(col_name(k.depid, depkey1),sign(keycnt),30))
+rtrim(substring(', '+col_name(k.depid, depkey2),sign(keycnt-1),30))
+rtrim(substring(', '+col_name(k.depid, depkey3),sign(keycnt-2),30))
+rtrim(substring(', '+col_name(k.depid, depkey4),sign(keycnt-3),30))
+rtrim(substring(', '+col_name(k.depid, depkey5),sign(keycnt-4),30))
+rtrim(substring(', '+col_name(k.depid, depkey6),sign(keycnt-5),30))
+rtrim(substring(', '+col_name(k.depid, depkey7),sign(keycnt-6),30))
+rtrim(substring(', '+col_name(k.depid, depkey8),sign(keycnt-7),30)),
rtrim(substring(col_name(k.id, key1),sign(keycnt),30))
+rtrim(substring(', '+col_name(k.id, key2),sign(keycnt-1),30))
+rtrim(substring(', '+col_name(k.id, key3),sign(keycnt-2),30))
+rtrim(substring(', '+col_name(k.id, key4),sign(keycnt-3),30))
+rtrim(substring(', '+col_name(k.id, key5),sign(keycnt-4),30))
+rtrim(substring(', '+col_name(k.id, key6),sign(keycnt-5),30))
+rtrim(substring(', '+col_name(k.id, key7),sign(keycnt-6),30))
+rtrim(substring(', '+col_name(k.id, key8),sign(keycnt-7),30))
from syskeys k
where k.type = 2
and k.depid = object_id('report')
(レポートをテーブルの名前に置き換えます)。
最初の列の戻り値は、このテーブルを指す外部キーを持つテーブルの名前です。 2番目の列は、このテーブルの列のリストです。 3番目の列は、参照テーブルのリスト列名です。
したがって、report.keyの外部キーである列rep_keyを持つテーブルpeople_reportがある場合、次のような結果が得られます。
people_report key rep_key
参照されているテーブル名だけを探している場合は、このコードが役立ちます
SELECT o.name
FROM sysobjects o
WHERE EXISTS ( SELECT 1 FROM sysconstraints C
JOIN sysreferences R ON R.constrid=C.constrid
WHERE EXISTS ( SELECT 1 FROM sysobjects o2
WHERE o2.id=C.tableid
AND o2.name ='tableName' )
AND R.reftabid=o.id )