0

次のような構造の 2 つのテーブルがあります。

People
----------
>ID, Name, Surname

Projects
----------
>ID, Assistant#1,  Assistant#2,  Assistant#3,  Assistant#4, 
> Assistant#5,  Assistant#6,  Assistant#7,  Assistant#8,  Assistant#9, 
> Assistant#10, lot of other columns..... (every assistant column
> contains an integer, the people ID)

ここで、DB にクエリを実行し、Project テーブルのすべての列を含む Project テーブル (ID=3 の行と仮定します) から単一の行を取得し、特に各アシスタントを正しい名前と姓に置き換えたいと考えています。私はこれを(多くの結合で)行うことができましたが、SQLの経験が少ないため、コードが非常にかさばるように見え、これを行うためのより良い方法があると確信しています.

前もって感謝します。

4

8 に答える 8

6
SELECT p.Name, p.Surname
FROM People p
CROSS JOIN Project j ON (p.PeopleID = j.Assistant1 OR
p.PeopleID = j.Assistant2 OR
p.PeopleID = j.Assistant3 OR
.. etc)
AND j.ProjectID = 3

あなたのパフォーマンスはひどいものになるでしょうが、それはひどい設計のデータベースを持つために支払う代償です. より良い解決策は、分解によってプロジェクトと人々をマッピングすることです。

CREATE TABLE proj_people
People_ID INT
Project_ID INT
于 2012-04-19T10:43:33.757 に答える
4

あなたの構造は私には明らかではありません。プロジェクト用のクラッチを作成することをお勧めします。

テーブル:

Peoples people_id, people_name, people_surname

Projects project_id、project_name

Clutch project_id, people_id

于 2012-04-19T10:41:23.647 に答える
0

(可能な)アシスタントの数を10に設定しているため、これらの10人のアシスタントに対応するためのコードを作成する必要があります。これはいくつかの方法で行うことができます:(テストされていません)

select * from projects proj
left join people p1 on proj.assistant1 = p1.peopleid
left join people p2 on proj.assistant2 = p2.peopleid
left join people p3 on proj.assistant3 = p3.peopleid
left join people p4 on proj.assistant4 = p4.peopleid
left join people p5 on proj.assistant5 = p5.peopleid
left join people p6 on proj.assistant6 = p6.peopleid
left join people p7 on proj.assistant7 = p7.peopleid
left join people p8 on proj.assistant8 = p8.peopleid
left join people p9 on proj.assistant9 = p9.peopleid
left join people p10 on proj.assistant10 = p10.peopleid

そうでなければ、あなたはいくつかのトリックを行うことができます

select proj.projectID, 
(select * from people where peopleID = proj.assistant1),
(select * from people where peopleID = proj.assistant2),
(select * from people where peopleID = proj.assistant3),
(select * from people where peopleID = proj.assistant4),
(select * from people where peopleID = proj.assistant5),
(select * from people where peopleID = proj.assistant6),
(select * from people where peopleID = proj.assistant7),
(select * from people where peopleID = proj.assistant8),
(select * from people where peopleID = proj.assistant9),
(select * from people where peopleID = proj.assistant10)
from projects proj

可能であれば、データテーブルを再構築し、単一のアシスタントを単一のprojectIDにマップするのが最善の場合があります。

PeopleID, Name, Surname

ProjectID, PeopleID

したがって、内部結合を1つだけ実行すると、アシスタントごとに1つの行が返されます。

select * from projects proj 
inner join people p 
on p.peopleID = proj.peopleid
where proj.projectID = PROJECTID
于 2012-04-19T10:50:31.590 に答える
0

未検証 :)

Select * from project pr
left join people pe1 on pe1.peopleid = pr.astint1
left join people pe2 on pe2.peopleid = pr.astint2
left join people pe3 on pe3.peopleid = pr.astint3
left join people pe4 on pe4.peopleid = pr.astint4
left join people pe5 on pe5.peopleid = pr.astint5 
left join people pe6 on pe6.peopleid = pr.astint6
left join people pe7 on pe7.peopleid = pr.astint7
left join people pe8 on pe8.peopleid = pr.astint8
left join people pe9 on pe9.peopleid = pr.astint9
left join people pe10 on pe10.peopleid = pr.astint10
where pr.projectid = 3
于 2012-04-19T10:43:13.700 に答える
0

おそらく、よりクリーンなデザインは次のとおりです。

人物表:

People ID, Name, Surname

ProjectAssistants テーブル:

Project ID, Assistant Person ID

プロジェクト表:

Project ID, lots of other columns (but no Assistant columns)

次に、SQL は次のようになります。

SELECT pr.*, p.* 
FROM Projects pr 
JOIN ProjectAssistants p_a ON pr.ProjectID = p_a ProjectID 
JOIN People p ON p_a.AssistantPersonID = p.PeopleID 
WHERE ProjectID = X
于 2012-04-19T10:44:42.630 に答える
0

あなたの問題は、データベース レベルでデータ プレゼンテーションの問題を解決しようとしているということであり、これはめったに良い考えではありません。テーブルの主キーとして両方の列の組み合わせを持ち、projectid と assistantid のみを保持するテーブルが必要です。これにより、このテーブルをアシスタント テーブルとプロジェクト テーブルに 1 回だけ結合して、必要なすべての結果を得ることができます。これには、クエリを変更してさらに結合を追加することなく、プロジェクトでさらに多くのアシスタントをサポートできるという利点もあります。

結論として、3 つのテーブルが必要です。

Project
Assistant
ProjectAssistant (projectid,assistantid)
于 2012-04-19T10:45:21.000 に答える
0

テーブルを再構築したい。本質的に同じものに対して複数の列を持つテーブルを複数回見るのは嫌いです。3 つのテーブルを持つように再構築する場合:

PeopleID | Name | Surname

計画

ProjectID | ...other columns except Assistant

Project_Person

ProjectID | PersonID

これにより、複数のアシスタント列を必要とせずに、複数のアシスタントを同じプロジェクトに割り当てることができます。次に、次のようなものを使用して、必要な結果を得ることができます。

SELECT proj.ProjectID, pers.Name, pers.Surname
FROM Person pers
INNER JOIN Project_Person pp ON pp.PersonID = pers.PersonID
INNER JOIN Project proj ON proj.ProjectID = pp.ProjectID

これは単一の行を返しませんが、それは SQL が機能するように設計された方法ではありません。

于 2012-04-19T10:45:29.510 に答える
0

テーブル構造を変更したくない/変更できない場合は、ユーザー定義関数を使用してください。

CREATE FUNCTION GET_ASS_NAME (n1 ASS_NO) RETURNS VARCHAR(50) DETERMINISTIC BEGIN DECLARE fullname VARCHAR(50); SELECT fullname = CONCAT(NAME, ' ', SURNAME) FROM PEOPLE WHERE ID = n1; RETURN fullname; END|

それから

select GET_ASS_NAME(1), GET_ASS_NAME(2), GET_ASS_NAME(3), ... from PROJECTS where ID = 3

于 2012-04-19T10:47:21.510 に答える