2

私は、タスク、ユニット、および建物の 3 つのテーブルを結合する作業を行っています。

タスク テーブルには、ユニットの列と建物の列があります。
単一のタスクは、建物またはユニットのみに割り当てられ、両方には割り当てられません。したがって、すべてのレコードの 1 つの列は常に null です。タスク テーブルには 6100 のレコードがあります。

このJOINを使用すると:

select * from task t
join building b on b.id = t.building_id;

私は628行を取得します。これは、ビルド タスクの正しい合計です。

このJOINを使うと

select * from active_task at
inner join unit_template ut on ut.id = at.unit_template_id

私は5472行を取得します。これは単位タスクの正しい数です。それらを合計すると、5472+628 = 6100 がタスク テーブルの正しい行数になります。

このクエリを実行すると:

select * from task t
inner join unit ut on ut.id = t.unit_id
inner join building bt on bt.id = t.building_id

私はゼロ行を取得します。6100 行を取得するにはクエリが必要です。どんな助けでも大歓迎です。

基本小胞体

4

3 に答える 3

2

左結合を試してください:

select * from task t
left join unit ut on ut.id = t.unit_id
left join building bt on bt.id = t.building_id
于 2012-05-24T22:39:14.143 に答える
2
SELECT  *
FROM    task t
LEFT JOIN
        unit ut
ON      ut.id = t.unit_id
LEFT JOIN
        building bt
ON      bt.id = t.building_id
        AND t.unit_id IS NULL
于 2012-05-24T22:39:30.930 に答える
1

両方のクエリによって与えられたすべての一致が必要な場合は、なぜ統合しないのですか?

SELECT * from task t JOIN building b ON b.id = t.building_id
UNION
SELECT * from active_task at JOIN unit_template ut ON ut.id = at.unit_template_id

2 つのタスク テーブルに同じ数のフィールドがあれば十分です (そうでない場合は、select ステートメントで必要な列をフィルター処理します)。

于 2012-05-24T22:46:53.097 に答える