[ad_1]
こんにちは、私は TSQL にあまり詳しくありません。 私は解決策に取り組んでいて、問題に陥りました。
次のようなテーブル構造があります。
SQL
CREATE TABLE Family ( Id INT NOT NULL PRIMARY KEY, MotherId INT REFERENCES Family(Id), FatherId INT REFERENCES Family(Id), Name VARCHAR(30) NOT NULL, Age INT NOT NULL );
このレコードがテーブルに存在する場合:
SQL
INSERT INTO people(Id, MotherId, FatherId, Name, Age) VALUES(1, NULL, NULL, 'David', 65); INSERT INTO people(Id, MotherId, FatherId, Name, Age) VALUES(2, NULL, NULL, 'Keti', 55); INSERT INTO people(Id, MotherId, FatherId, Name, Age) VALUES(3, 2, 1, 'Crysti', 25); INSERT INTO people(Id, MotherId, FatherId, Name, Age) VALUES(4, 2, 1, 'Ellen', 18);
私が達成したいのは、各親の最年少の子供を取得することです。 上記のサンプル データのように、期待される結果は次のようになります。
SQL
Name Age ============= David 25 Keti 25
よろしく。
私が試したこと:
私は次のような複数の解決策を試しました UNIONS、JOINS、CTE (…) などなどですが、すべて無駄です。 前述したように、私は TSQL クエリを作成する専門家ではありません。
解決策 1
データおよび/または期待される結果が間違っています: 18 は、そのデータの両方のケースで最年少の子供です。
それぞれの親の末っ子を見つけることから始めます。
SQL
SELECT MotherID, MIN(Age) As Age FROM People GROUP BY MotherID HAVING MotherID IS NOT NULL; SELECT FatherID, MIN(Age) As Age FROM People GROUP BY FatherID HAVING FatherID IS NOT NULL;
次に、JOIN を使用して親の名前を取得します。
SQL
SELECT a.Name, b.Age FROM People a JOIN (SELECT MotherID, MIN(Age) As Age FROM People GROUP BY MotherID HAVING MotherID IS NOT NULL) b ON a.ID = b.MotherId; SELECT a.Name, c.Age FROM People a JOIN (SELECT FatherID, MIN(Age) As Age FROM People GROUP BY FatherID HAVING FatherID IS NOT NULL) c ON a.ID = c.FatherId;
その後、UNION を使用して 2 つの結果セットを組み合わせることができます。
解決策 2
CTEも使用できます:
SQL
WITH Fathers AS (SELECT F.FatherId, MIN(F.Age) Age FROM dbo.Family AS F WHERE F.FatherId IS NOT NULL GROUP BY F.FatherId), Mothers AS (SELECT F.MotherId, MIN(F.Age) Age FROM dbo.Family AS F WHERE F.MotherId IS NOT NULL GROUP BY F.MotherId) SELECT Fathers.FatherId AS ParentId, Fathers.Age FROM Fathers UNION ALL SELECT Mothers.MotherId, Mothers.Age FROM Mothers;
解決策 4
選択 * から
(
select a.Name, min(b.Age) age from People a INNER JOIN People b ON a.PersonID = b.Father group by a.Name
連合
select a.Name, min(b.Age) from People a INNER JOIN People b ON a.PersonID = b.Mother group by a.Name;
)t
名前順、年齢順
[ad_2]
コメント