2

関連付けられていないテーブルが 2 つあります。

PEOPLE テーブル:

   ID | NAME | AGE
    ------------
   1  | DAVE | 43
   1  | ANNE | 25
   1  | MIKE | 58

場所表:

ID | COUNTRY | TOWN
------------------
1  |   USA    | WILMINGTON
1  |   GER    | BERLIN
1  |   POR    | LISBON
1  |   JPN    | KYOTO

次のような結果が必要です。

NAME | AGE | COUNTRY | TOWN
-----------------------------
ANNE |  25 | GER     | BERLIN
DAVE |  43 | JPN     | KYOTO
MIKE |  58 | POR     | LISBON
           | USA     | WILMINGTON
4

4 に答える 4

4

これを試してみましょう:

SELECT COALESCE(a.Name, '') Name,
       COALESCE(a.Age, '') Age,
       b.Country,
       b.Town
FROM
    (SELECT ROW_NUMBER() OVER (ORDER BY [Name]) AS RowNum, Name, Age
     FROM   People) a Right Join 
    (SELECT ROW_NUMBER() OVER (ORDER BY [Country]) AS RowNum, Country, Town
     FROM   Places) b ON a.RowNum = b.RowNum
于 2012-05-24T02:23:40.720 に答える
1

私はこれを完全にお勧めしません!!! しかし、私はそれが良い挑戦だと思いました。ショーンの推奨に従って、キーを使用してこれを行うことを強くお勧めします。

とにかく、このクエリは、スキーマを変更せずに、要求したものを正確に提供します(データが正確に表現されていることも前提としています)。

例:http ://www.sqlfiddle.com/#!3/a0486/8

Select Distinct
  case when town = 'Wilmington' Then NULL else Name end as Name, 
  case when town = 'Wilmington' Then NULL else Age end as Age,
  Country, 
  Town
FROM People, Places
Where 
     (Name = 'Anne' AND Town = 'Berlin')
  OR (Name = 'Dave' AND Town = 'Kyoto')
  OR (Name = 'Mike' AND Town = 'Lisbon')
  OR (Town = 'Wilmington')
Order By Country Asc

編集

私の答えを完成させ、より適切な解決策を提供するために、両方のテーブルにPlaceIDを追加してから、左結合することをお勧めします。

例:http ://www.sqlfiddle.com/#!3 / d5ee8 / 3

Create Table People(
  Name varchar(255),
  Age int,
  PlaceID int
)

Create Table Places(
  PlaceID int,
  Country varchar(255),
  Town varchar(255)
)

Insert Into People Values ('Dave', 43, 2)
Insert Into People Values ('Anne', 25, 1)
Insert Into People Values ('Mike', 58, 3)

Insert Into Places Values (1, 'Ger', 'Berlin')
Insert Into Places Values (2, 'Jpn', 'Kyoto')
Insert Into Places Values (3, 'Por', 'Lisbon')
Insert Into Places Values (4, 'USA', 'Wilmington')

Select 
  Name, Age, Country, Town 
FROM 
  Places
  Left Join People On Places.PlaceID = People.PlaceID
于 2012-05-24T02:19:20.993 に答える
1

これらをアルファベット順に並べてほしいと思いますが、あまり意味がありません...

WITH x AS (SELECT *, rn = ROW_NUMBER() OVER (ORDER BY NAME) FROM People),
     y AS (SELECT *, rn = ROW_NUMBER() OVER (ORDER BY COUNTRY) FROM Places)
SELECT * FROM x FULL OUTER JOIN y ON x.rn = y.rn;
于 2012-05-24T02:20:59.440 に答える
1

結合するには、各テーブルに少なくとも 1 つのデータが必要です。通常、これは主キー/外部キーの関係で処理されます。PLACES テーブル (例: 1=USA、2=GER、3=POR、4=JPN) に主キーを作成し、PEOPLE テーブルの各人物の適切な場所に一致する列に外部キーを配置できます (例: 2=アン、4=デイブ、3=マイク)。

于 2012-05-24T02:08:58.487 に答える