2012-03-29 22 views
0

私は数日間これと戦ってきました。私はSQLの専門家ではなく、いくつかのクエリを作成することができましたが、クエリをまとめるという実際の仕事があります。SQL結合の問題 - 2つの関連するクエリを結合する(完全外部結合)

例えば、私は次の2つのクエリに参加したい:

SELECT publication_id AS Pure_Publication_Id, caa.person_id, 
    caa.name_first_name AS Primary_Author_First_Name, 
    caa.name_last_name AS Primary_Author_Last_Name 
FROM pure.classified_author_assoc caa 
    LEFT OUTER JOIN Pure.Publication 
     ON Caa.Publication_Id = Publication.Id 
WHERE Caa.Person_Id IS NOT NULL 
    AND publication.id IN 
    (
     SELECT DISTINCT pure.publication_project_assoc.publication_id 
     FROM Pure.project 
      JOIN Pure.Publication_project_assoc 
       ON project.id = Pure.Publication_project_assoc.project_id 
     WHERE pure.project.source_id IN ('XEP378', 'XES049', 'YAH001') 
    ) 
GROUP BY publication_id, caa.person_id, caa.name_first_name, caa.name_last_name; 

SELECT publication.id AS Pure_Publication_Id 
    COUNT (person_id) AS "NUMBER_OF_AUTHORS", 
    CASE WHEN COUNT (person_id) > 1 THEN 'Yes' 
     else 'No' END AS Additional_Authors 
FROM pure.classified_author_assoc caa 
    LEFT OUTER JOIN Pure.Publication 
     ON Caa.Publication_Id = Publication.Id 
WHERE Caa.Person_Id IS NOT NULL 
    AND publication.id IN 
    (
     SELECT DISTINCT pure.publication_project_assoc.publication_id 
     FROM Pure.project 
      JOIN Pure.Publication_project_assoc 
       ON project.id = Pure.Publication_project_assoc.project_id 
     WHERE pure.project.source_id IN ('XEP378', 'XES049', 'YAH001') 
    ) 
GROUP BY publication.id; 

を、私は単一のクエリでそれらを組み合わせることはできません(私は考えていない)最初のクエリとしてNumber_of_authorsを1として返すだけです。しかし、私がクエリを実行しようとすると、真ん中で完全に次のように結合されますが、SQLコマンドが最初のSQL文の最後に正しく終了しないというエラーが発生します。終わり。

SELECT publication_id AS Pure_Publication_Id, caa.person_id, 
    caa.name_first_name AS Primary_Author_First_Name, 
    caa.name_last_name AS Primary_Author_Last_Name 
FROM pure.classified_author_assoc caa 
    LEFT OUTER JOIN Pure.Publication 
     ON Caa.Publication_Id = Publication.Id 
WHERE Caa.Person_Id IS NOT NULL 
    AND publication.id IN 
    (
     SELECT DISTINCT pure.publication_project_assoc.publication_id 
     FROM Pure.project 
      JOIN Pure.Publication_project_assoc 
       ON project.id = Pure.Publication_project_assoc.project_id 
     WHERE pure.project.source_id IN ('XEP378', 'XES049', 'YAH001') 
    ) 
GROUP BY publication_id, caa.person_id, caa.name_first_name, caa.name_last_name 
FULL OUTER JOIN 
(
    SELECT publication.id AS Pure_Publication_Id, 
     COUNT (person_id) AS "NUMBER_OF_AUTHORS", 
     CASE WHEN COUNT (person_id) > 1 THEN 'Yes' 
      else 'No' END AS Additional_Authors 
    FROM pure.classified_author_assoc caa 
     LEFT OUTER JOIN Pure.Publication 
      ON Caa.Publication_Id = Publication.Id 
    WHERE Caa.Person_Id IS NOT NULL 
     AND publication.id IN 
     (
      SELECT DISTINCT pure.publication_project_assoc.publication_id 
      FROM Pure.project 
       JOIN Pure.Publication_project_assoc 
        ON project.id = Pure.Publication_project_assoc.project_id 
      WHERE pure.project.source_id IN ('XEP378', 'XES049', 'YAH001') 
     ) 
) 
GROUP BY publication.id 
ON ****; 

私はこれをあらゆる方法で試してみて、それが何か簡単なものでなければならないことを知っています。誰でも助けてくれますか?

+1

複雑でないサンプルでこの問題を説明することはできますか? – hkutluay

答えて

0

これは、あなたが探しているものをされています

SELECT FirstQuery.*, SecondQuery.* 
FROM 
    (
     SELECT publication_id AS Pure_Publication_Id, caa.person_id, 
      caa.name_first_name AS Primary_Author_First_Name, 
      caa.name_last_name AS Primary_Author_Last_Name 
     FROM pure.classified_author_assoc caa 
      LEFT OUTER JOIN Pure.Publication 
       ON Caa.Publication_Id = Publication.Id 
     WHERE Caa.Person_Id IS NOT NULL 
      AND EXISTS 
      (
       SELECT 1 
       FROM Pure.project 
       JOIN Pure.Publication_project_assoc 
        ON project.id = Pure.Publication_project_assoc.project_id 
       WHERE pure.publication_project_assoc.publication_id = publication.id 
        AND pure.project.source_id IN ('XEP378', 'XES049', 'YAH001') 
     ) 
     GROUP BY publication_id, caa.person_id, caa.name_first_name, caa.name_last_name 
    ) AS FirstQuery 
    FULL OUTER JOIN 
    (
     SELECT publication.id AS Pure_Publication_Id, 
      COUNT (person_id) AS "NUMBER_OF_AUTHORS", 
      CASE WHEN COUNT (person_id) > 1 THEN 'Yes' 
       else 'No' END AS Additional_Authors 
     FROM pure.classified_author_assoc caa 
      LEFT OUTER JOIN Pure.Publication 
       ON Caa.Publication_Id = Publication.Id 
     WHERE Caa.Person_Id IS NOT NULL 
      AND EXISTS 
      (
       SELECT 1 
       FROM Pure.project 
        JOIN Pure.Publication_project_assoc 
         ON project.id = Pure.Publication_project_assoc.project_id 
       WHERE pure.publication_project_assoc.publication_id = publication.id 
        AND pure.project.source_id IN ('XEP378', 'XES049', 'YAH001') 
      ) 
     GROUP BY publication.id 
    ) AS SecondQuery 
     ON FirstQuery.Pure_Publication_Id = SecondQuery.Pure_Publication_Id 

このロットすっきりを行う方法は、おそらくありますが、これは、あなたのFULL OUTER JOINを実行する方法です。ネストされたクエリを使用しています。 FirstQueryに何もカウントがない場合、FULL OUTER JOINはNULL結果を返します。だから、私はLEFT JOINに変更することをお勧めします。最適化ポイントのSecondQuery

UPDATEに一致する値がない場合

  • publication.id INを追加することにより、ノーツ/これはFirstQueryに値があることを確認しますが、それは文句を言わない気に、あなたは相殺あなたLEFT JOIN。あなたはそれが本当にLEFT JOINになりたい場合は、このフィルタ基準はLEFT JOINON声明に入れなければなりません
  • は混乱を削減し、同じ結果に
+0

感謝ジャスティン、問題は、列が同一ではない、これは方法のラウンドですか?クエリを簡素化する方法もわかりませんが、私は髪を引き裂いています。私はUnion Allを試しましたが、私はまだ同じエラーメッセージが表示されています。どんなアイデアですか? – Scott

+0

@Scott私は私の答えを更新しました。これはまだ醜いですが、動作します –

+0

ジャスティン、あなたの人生を救ってくれてありがとう。私はこれが非常に醜いことを知っているので、私のSQLにもっと多くのことを働かせる必要がありますが、結果は達成されています。何らかの理由で、それはまだ ")as FirstQuery/SecondQuery"で動作しませんでしたし、それを動作させるためにASを削除しなければなりませんでした。すべてのあなたの助けをありがとう、あなたはスターです! – Scott

1

を達成するためにEXISTSであるためにあなたのINを変更2番目のクエリを最初のFROM句にジョインする必要があります。また、私はあなたが実際にはFULL JOINではなくLEFT JOINの後にいるかもしれないと思われます。おそらくWITH句が少し役に立ちます。

WITH q AS (
(SELECT publication.id AS Pure_Publication_Id, COUNT (person_id) AS "NUMBER_OF_AUTHORS", CASE WHEN COUNT (person_id) > 1 THEN 'Yes' else 'No' END AS Additional_Authors 
... 
) 
SELECT publication_id AS Pure_Publication_Id, caa.person_id, caa.name_first_name AS Primary_Author_First_Name, caa.name_last_name AS Primary_Author_Last_Name, q.NUMBER_OF_AUTHORS, q.additional_authors 
    FROM pure.classified_author_assoc caa 
      LEFT OUTER JOIN Pure.Publication ON Caa.Publication_Id = Publication.Id 
      LEFT OUTER JOIN q ON publication_id = q.pure_publication_id 
WHERE Caa.Person_Id IS NOT NULL 
    AND publication.id IN 
     (SELECT DISTINCT pure.publication_project_assoc.publication_id 
... 
関連する問題