問題タブ [scalar-subquery]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
305 参照

sql-server-2008 - 行をチェックする SQL スカラー サブクエリが見つかりました

序章

場合によっては、結合の代わりに意図的にスカラー サブクエリを使用して、複数の行が見つからないことを確認できます。たとえば、いくつかのperson行の国籍を検索するために、このクエリを使用する場合があります。

select p.name, c.iso from person p join person_country_map pcm on p.id = pcm.person join country c on pcm.country = c.id where p.id in (1, 2, 3)

ここで、person_country_mapが関数マッピングではないとします。特定の人物が複数の国にマップされる場合があるため、結合によって複数の行が検出される場合があります。または、実際には、少なくともデータベースの制約に関する限り、人物がマッピング テーブルにまったく含まれていない可能性があります。

しかし、この特定のクエリでは、クエリを実行している人物が 1 つの国しか持っていないことをたまたま知っています。それが私のコードの基礎となる仮定です。しかし、可能であればその仮定を確認したいと思います。何かがうまくいかず、複数の国を持つ人、または国のマッピング行がない人に対してこのクエリを実行しようとした場合、それは死ぬでしょう。

最大 1 行の安全性チェックを追加する

複数の行をチェックするには、結合をスカラー サブクエリとして書き直すことができます。

select p.name, ( select c.iso from person_country_map pcm join country c on pc.country = c.id where pcm.person = p.id ) as iso from person p where p.id in (1, 2, 3)

現在、照会された人物が 2 つ以上の国にマップされている場合、DBMS はエラーを返します。単純な結合のように、同じ人物に対して複数のエントリが返されることはありません。そのため、行がアプリケーションに返される前であっても、このエラー ケースがチェックされていることを知っていると、少し楽に眠ることができます。もちろん、慎重なプログラマーとして、アプリケーションもチェックインすることがあります。

行が見つからない 場合に安全性をチェックすることは可能ですか?

しかし、 person_country_map に人物の行がない場合はどうなるでしょうか? その場合、スカラー サブクエリは null を返すため、左結合とほぼ同等になります。

(議論のために、 person_country_map.country から country.id への外部キーと、country.id の一意のインデックスを想定して、特定の結合が常に成功し、正確に 1 つの国の行を見つけるようにします。)

私の質問

1 つだけの結果が必要であることを SQL で表現できる方法はありますか? 単純なスカラー サブクエリは「0 または 1」です。言えるようになりたい

select 42, (select exactly one x from t where id = 55)

サブクエリが行を返さない場合、クエリは実行時に失敗します。もちろん、上記の構文は架空のものであり、それほど簡単ではないと確信しています。

私は MSSQL 2008 R2 を使用しています。実際、このコードはストアド プロシージャに含まれているため、必要に応じて TSQL を使用できます。(もちろん、ビュー定義でも使用できるため、通常の宣言型 SQL の方が望ましいです。)もちろん、チェックを実行することもexists、値を選択して TSQL 変数に入れ、null かどうかを明示的にチェックすることもできます。結果を一時テーブルに選択し、そのテーブルにチェックとして一意のインデックスを作成することもできます。しかし、サブクエリが正確に 1 つの行を返すという私の仮定をマークし、その仮定を DBMS にチェックさせる、これ以上読みやすく洗練された方法はありませんか?

0 投票する
2 に答える
834 参照

sql - サブクエリは、SQL Server 2008 で複数の値を返しました

私がまだ立ち往生している私の前の質問を見てください。 サブクエリを使用してステートメントを挿入する

対処する必要がある 4 つの列があり、テーブルを削除して 4 番目の列を int not null から a に変更することはできません。

私はこの元の声明から導かれました:

エラーがスローされます:

値 NULL を列 'LineSequence'、テーブル 'ADVNET.dbo.KenCatItemTest' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

だから今、私は代わりにこの声明を見ています:

この新しいステートメントはエラーをスローします。

サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。メッセージ 515、レベル 16、状態 2、行 5 値 NULL を列 'ItemId'、テーブル 'ADVNET.dbo.KenCatItemTest' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

0 投票する
1 に答える
2690 参照

sql-server - 計算された列の値を同じ SQL クエリ内の別の列に使用する方法

SubQuery を使用して結果を取得するクエリを作成しています。

毎回サブクエリを書き直す代わりに、列 1 の同じ出力値を別の列への入力として使用して、さらに計算したいと考えています。

ポイント 1: 任意の変数を使用して値を保存し、同じ値を別の列に使用できますか。

予想されるコードの例:

0 投票する
1 に答える
69 参照

mysql - MySQL 更新で相関サブクエリの割り当てで複数の列を回避する方法

コミュニティの郵便番号に基づいて、ここで説明されている SQLでHaversine 式を使用して、コミュニティに最も近い場所を割り当てようとしています。単一のスカラー値を返す必要がありますが、最も近い場所を特定するために必要な 2 番目に計算された距離値を取得することは避けられないようです。ヘルプ。

0 投票する
1 に答える
1490 参照

tsql - TSQL: SELECT CASE WHEN THEN サブクエリ: エラー: サブクエリが複数の値を返す

エラーが発生します

以下のクエリで

(コメントのコードも試しました)複数の行を返すことができない個別の値を選択することで思ったので、本当に説明できません。私は何を間違っていますか??

0 投票する
2 に答える
1110 参照

sql-server - 'Exist' 関数内に cte と top 1 を持つスカラー値関数

私のクエリは「exists」関数をフィルターとして使用し、その中にスカラー値関数があります。スカラー値関数には、cte と "(select top 1 1)" が含まれます。私が存在する場合、それはまったくフィルタリングされません。むしろ、「where 1=(svf)」を使用するとうまくいくようです。存在するクエリで何かを見逃したり、間違ったりしましたか?

p>