2

Entity私の目標は、2 人で構成されるすべての世帯のテーブルに HouseholdName フィールドを計算して設定することです。私は SQL Server 2012 を使用しており、使用する必要があるスキーマは次のとおりです。

CREATE TABLE Entity
(
   EID INT, --PK
   PID INT, --FK to Person.[Person ID]
   HouseholdID VARCHAR(50), 
   HouseholdName VARCHAR(300)
);

CREATE TABLE Person
(
   [Person ID] INT, 
   FirstName   VARCHAR(30), 
   LastName    VARCHAR(30)
);

INSERT INTO Entity VALUES (1,1,'HH1',NULL);
INSERT INTO Entity VALUES (2,2,'HH1',NULL);
INSERT INTO Entity VALUES (3,3,'HH2',NULL);
INSERT INTO Entity VALUES (4,4,'HH2',NULL);
INSERT INTO Entity VALUES (5,5,'HH3',NULL);

INSERT INTO Person VALUES (1,'Jane', 'Doe');
INSERT INTO Person VALUES (2,'Joe',  'Doe');
INSERT INTO Person VALUES (3,'Sara', 'Dillin');
INSERT INTO Person VALUES (4,'Bill', 'Smith');
INSERT INTO Person VALUES (5,'Ted',  'Loner');

世帯名を計算するロジックは次のとおりです。HouseholdID のように両方の姓が同じである場合HH1、世帯名は「Jane & Joe Doe」になります。姓が異なる場合HH2は、「Sara Dillin & Bill Smith」の形式にする必要があります。

人を特定して、次のように並べ替えることができます。

SELECT FirstName,LastName,HouseholdID
FROM Entity e
JOIN Person p ON p.[Person ID]=e.[PID]
WHERE HouseholdID IN  --HHs of 2 people
(
   SELECT DISTINCT HouseholdID
   FROM Entity e
   JOIN Person p ON p.[Person ID]=e.[PID]
   GROUP BY HouseholdID HAVING COUNT(*)=2
)
ORDER BY HouseholdID

しかし、私はそれを過ぎて立ち往生しています。C# のような手続き型言語から、これを解決する方法を知っていますが、遅いです。より高速な SQL の方法でそれを実行できるようになりたいと思っています。

4

1 に答える 1

1

申し訳ありませんが、コードを簡単にするためにフィールド名を少し変更しました。次のクエリは、必要なものを取得します。

SELECT 
  e1.HouseholdID,
  CASE WHEN p2.LastName =  p1.LastName THEN  p1.FirstName + ' & ' + p2.FirstName + ' ' + p2.LastName
       ELSE p1.FirstName + ' ' + p1.LastName + ' & ' + p2.FirstName + ' ' + p2.LastName END AS HouseholdName,
  p1.FirstName,
  p1.LastName,
  p2.FirstName as p2FirstName,
  p2.LastName as p2LastName
FROM 
 Person p1 
 INNER JOIN Entity e1 ON 
   p1.id = e1.PID
 LEFT JOIN Entity e2 
   ON e1.HouseholdID = e2.HouseholdID AND e1.id < e2.id
 LEFT JOIN Person p2
   ON e2.PID = p2.id
WHERE e2.ID IS NOT NULL
  AND NOT EXISTS 
    ( SELECT * FROM Entity e3 
      WHERE e1.HouseholdID = e3.HouseholdID
      AND NOT e3.id IN (e1.id, ISNULL(e2.id, 0))
    )

http://sqlfiddle.com/#!3/c8dd9/15

于 2013-01-13T00:11:22.357 に答える