0

2 つのサブタイプ a、b から 1 つのサブタイプ テーブルを選択する必要がある 1 つのスーパータイプ テーブルがあります。サブタイプは他のサブタイプと一緒に使用できないため、クエリを実行するには、スーパータイプ ID がサブタイプの 1 つに含まれているかどうかを確認する必要があります。実験クエリを実行していますが、うまくいきません。

なんとなく思いついたのが以下です。

SELECT * from supertypetable INNER JOIN 
IF  (a.id = given.id) then a ON a.id = supertypetable.id
ELSE  b ON b.id = supertetable.id

job Table
________________________________
|job_id| blach2x....
________________________________
|    1  |
|    2  |
|    3  |
________________________________

partime Table
________________________________
|job_id| blach2x....
________________________________
|    2  |
|    3  |
________________________________

fulltime Table
________________________________
|job_id| blach2x....
________________________________
|    1  |
|       |
________________________________

指定した ID を満たすテーブルを結合したい

4

3 に答える 3

0

a.id が b.id と等しくならない場合は、両方のテーブルを結合してから UNION を実行すると、id が一致したテーブルのみが結果を返します。

SELECT * from supertypetable 
INNER JOIN 
a ON a.id = supertypetable.id
UNION
SELECT * from supertypetable 
INNER JOIN 
b ON b.id = supertypetable.id

a.id が b.id と等しい場合、これは機能しません。しかし、それはアイデアです

コメントごとの編集: このアプローチは、a と b の構造が同一である場合にのみ機能します。

于 2013-03-19T18:29:53.167 に答える
0

これは、rails/activerecord のポリモーフィック ジョインによく似ています。そこに実装されている方法では、「スーパータイプ」テーブルには、subtype_id と subtype_type の 2 つのフィールドがあります。subtype_type テーブルには、正しいサブタイプ テーブルの名前に簡単に変換できる文字列があります。subtype_id には、そのテーブルの行の ID があります。このようにテーブルを構成すると役立つ場合があります。

あなたがしなければならない次の質問は、あなたが結果に何を見ることを期待しているのかということです. スーパータイプ テーブルとすべてのサブタイプ テーブルを表示したい場合は、おそらく一度に 1 つずつ結合してから、すべてを結合する必要があります。つまり、最初にサブタイプ テーブルの 1 つだけに対して結合し、次に次のテーブルに対して結合します。これが目的でない場合は、質問をさらに明確にすることができます。

于 2013-03-19T18:27:46.227 に答える
0

したがって、1つの簡単な提案は次のとおりです。

   SELECT * FROM job
    left join parttime on parttime.job_id = job.job_id
    left join fulltime on fulltime.job_id = job.job_id
where job.job_id = @job_id

次に、結合された 2 つのテーブルのどちらが NULL データを持たないかをアプリケーションに判断させ、それを表示させます。

一貫性のないデータセットを気にせず、常に正しい返されたセットが必要な場合 (ただし、前述のように、パートタイムとフルタイムの構造が異なるため、何らかのアプリケーション ロジックが必要になりますが、どうですか?ある種の検査なしで条件付きでデータを表示/利用するには?そして、その検査を行う場合は、前もってそれを行い、指定された job_id のサブタイプを把握してから、適切なものを選択するだけですそこで実行するクエリ)。

ごめん!余談!

ストアド プロシージャは、このロジックを実行できます (すべての結合を削除しました。例にすぎません)。

CREATE PROCEDURE getSubTypeDATA (@job_id int)
BEGIN

IF (SELECT EXISTS(SELECT 1 FROM parttime WHERE job_id = @job_id)) = 1
BEGIN
SELECT * from parttime
END
ELSE
BEGIN
SELECT * from fulltime
END

END

または、一貫したデータセット (アプリケーション ロジックに最適) が必要な場合は、フルタイムとパートタイムの間で共通の列を UNION ステートメントに配置し、共有しない列に対してハードコードされた NULL を作成しないでください。たとえば、fullTime が次のように見える場合

EmployeeID、DepartmentID、Salary

そしてパートタイムは次のように見えました

EmployeeID、DepartmentID、HourlyRate

あなたができる

SELECT job.*, employeeid, departmentid, salary, null as hourlyrate FROM job inner join fulltime on fulltime.job_id = job.job_id
where job.job_id = ?
union
  SELECT job.*, employeeid, departmentid, null as salary, hourlyrate FROM job inner join parttime on parttime.job_id = job.job_id
where job.job_id = ?

数百の異なる列がある場合、これは扱いにくい場合があります。また、これで明らかにならなかった場合、完全に異なる構造のサブタイプを持つが、同じ外部キーを使用することは、第 3 正規形を破っているという非常に良い手がかりになります。

于 2013-03-19T18:45:18.473 に答える