web-dev-qa-db-ja.com

マルチSELECTSQLステートメント

私の最初のネストされたSELECTステートメントを書いて、誰かが私を助けてくれることを願っています。

CompanyCodeテーブルからAgentIdUniqueAgentIdtoUniqueAgentIdを取得する必要があります。ただし、必要なのは別のテーブルからのクエリに表示されるものだけです。行間の共通リンクはUniqueAgentId列になります(基本的に、同じCompanyCodeを含む行からAgentIdUniqueAgentIdを取得する必要がありますネストされたクエリで表示されます)。

このクエリを書き出すと、非常に役立つメッセージが表示されます

')'の近くの構文が正しくありません

クエリ:

SELECT 
    CompanyCode, AgentId
FROM 
    UniqueAgentIdToUniqueAgentId un
WHERE 
    un.UniqueAgentId = 
       (SELECT UniqueAgentId 
        FROM 
            (SELECT q.LastChangeDate, a.UniqueAgentId 
             FROM QueueUpdates q, AgentProductTraining a 
             WHERE a.LastChangeDate >= q.LastChangeDate)
       )

編集ご回答ありがとうございます。以下のすべてのクエリを使用すると、同じエラーメッセージが表示され続けます:無効なオブジェクト名 'UniqueAgentIdToUniqueAgentId'。これは、SQL Management Studioが表示できるデータベース上の実際のテーブルであるため、私には奇妙です。

2番目の編集これは単にスペルミスであることが判明しました。新しいエラーは、「varchar値「3030111101」の変換がint列をオーバーフローしました」です。これが何を意味するのかよくわかりません...

最終編集charとitを比較しようとしたため、このエラーが発生しました。助けてくれてありがとう!

3
NealR

多くのデータベースにサブクエリがある場合は、エイリアスを指定する必要があります。

SELECT CompanyCode, AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId = 
      (SELECT UniqueAgentId 
       FROM (SELECT q.LastChangeDate, a.UniqueAgentId 
             FROM QueueUpdates q, AgentProductTraining a 
             WHERE a.LastChangeDate >= q.LastChangeDate
            ) t
      )

ただし、内部クエリは複数の値を返す可能性があり、2つのネストされたクエリは必要ありません。

SELECT CompanyCode, AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId in
      (SELECT UniqueAgentId 
       FROM QueueUpdates q, AgentProductTraining a 
       WHERE a.LastChangeDate >= q.LastChangeDate
      )

また、この場合はJOIN構文を使用する方が適切です。

SELECT CompanyCode, AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId in
      (SELECT UniqueAgentId 
       FROM QueueUpdates q join
            AgentProductTraining a 
            on a.LastChangeDate >= q.LastChangeDate
      )

それは役立つはずです。

3
Gordon Linoff
SELECT CompanyCode, AgentId
    FROM UniqueAgentIdToUniqueAgentId un
    WHERE un.UniqueAgentId = 
    (
        SELECT UniqueAgentId 
         FROM AgentProductTraining  where UniqueAgentId IN
           (
            SELECT q.LastChangeDate, a.UniqueAgentId 
            FROM QueueUpdates q, AgentProductTraining a 
            WHERE a.LastChangeDate >= q.LastChangeDate
            )
    )
0
Tom

実際に報告された問題であるエイリアスを宣言する必要があり、複数の戻り値に対して=演算子の代わりにIN句を使用する可能性があります。

SELECT CompanyCode
    ,AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId in (
        SELECT UniqueAgentId
        FROM (
            SELECT q.LastChangeDate
                ,a.UniqueAgentId
            FROM QueueUpdates q
                ,AgentProductTraining a
            WHERE a.LastChangeDate >= q.LastChangeDate
            ) a 
        )
0
RobB

サブクエリは複数の値を返す場合があります。 INを使用する必要があります。
2つのサブクエリを回避して、1つだけを使用することもできます。

SELECT CompanyCode, AgentId
FROM UniqueAgentIdToUniqueAgentId un
WHERE un.UniqueAgentId IN 
(
    SELECT a.UniqueAgentId 
    FROM QueueUpdates q, AgentProductTraining a 
    WHERE a.LastChangeDate >= q.LastChangeDate
)

このようにして、テーブルエイリアスのデカルト積を取得しますqおよびa。これがあなたの望むものかどうかはわかりません。多分結合はより良いはずです。

0
Andrea Colleoni