2

だからここに私が達成しようとしているものがあります。関連テーブルと一緒にリンクしようとしている 2 つのテーブルに座標データがあります。これは 1 対 1 の関連付けであるため、テーブル A に 40 レコード、テーブル B に 40 レコードがある場合、関連付けテーブルには 40 レコードが必要です。

現在、これら 2 つのテーブルのデータはほぼ同じですが、決して同一ではありません。実際、同じ精度になることはめったにありません。1 つのテーブル (A とします) には常に小数点以下 6 桁がありますが、テーブル B には小数点以下の桁数がないか、小数点以下 6 桁まである場合があります。

たとえば、テーブル A の 12.345678 とテーブル B を 12.34 と一致させるだけだとします。

したがって、テーブル B のデータの末尾にゼロを強制する asp.net コードに foreach があるため、最初に 12.345678 と 12.340000 を比較します。

次に、12.34567 に対して、12.34000 です。次に 12.3456 に対して、12.3400 次に 12.345 に対して、12.340

その後、12.34、対、12.34。

テーブル A の 12.345678 またはテーブル B の 12.34 への参照を含む関連付けレコードがまだ存在しない限り、新しい関連付けレコードが作成されます。

ジョー、テーブル A のデータとテーブル B のデータをどのように比較していますか? この部分は一番変なので、最後に取っておきました。

私は LIKE を使用していますが、これは一部の人を動揺させると確信しています。

これまでのところ、約 95% の確率で最高の結果が得られているからです。残りの 5% の大部分は、データがあまりにも異なっているためですが、絶対に一致するはずの非常に奇妙なサブセットがあります。

そのため、レコードを挿入する前に一致を確認し、一致が 1 つしかない場合は関連付けレコードを作成します。

SELECT COUNT(*) FROM dbo.StartCoord 

WHERE StartLatitude LIKE '12.817%' 
AND StartLongitude LIKE '12.819%'

今、12.817 と 12.819 の元になったレコードを見ていますが、完全な値は実際には 12.8179 と 12.8199 です。したがって、うまくいくはずで、95% の確率でうまくいきます。

奇妙な部分としては、LIKE (文字列の一致のみに使用する必要があります) を使用すると、SQL Server がバックグラウンドで丸めを実行する可能性があります。上記の stmt は機能しませんが、Microsoft SQL Server Management でそれをスローして、次のように変更すると...

SELECT COUNT(*) FROM dbo.StartCoord 

WHERE StartLatitude LIKE '12.817%' --trying to string match 12.8179
AND StartLongitude LIKE '12.82%'   --trying to string match 12.8199

...できます!

実際には LIKE ではないという人がいると思いますが、LIKE '12.817%' を float と比較しているという事実と、その float が SQL Server に丸めメカニズムを実行させているという事実があります。

しかし、その場合、LIKE '12.817%' が元の 12.8179 と一致するのはなぜでしょうか? 同様に丸めるべきではなく、12.82 の場合にのみ一致するべきではありませんか?

これを読んだ後、誰かが将来同じ問題を抱えている他の誰かに使用できるより良いタイトルを持っているなら、それは素晴らしいことです.

ありがとう。

編集:だから、なぜこのアプローチが取られたのかを完全に忘れていました。1 つのテーブルには、実際の真理データが小数点以下 6 桁まで格納されています。これは、テーブル A の例として一貫して使用していると思います。ただし、小数点以下 0 桁から 6 桁まで変化する表 B のデータは、丸められる場合と丸められない場合があります。

したがって、表 A には 12.123456 があり、場合によっては、表 B のデータが 12.1234 または 12.1235 になることがあります。彼らが私たちにデータを提供する方法は一貫していません。これらのケースの両方を処理するために丸めまたはキャスト (数値) を使用すると、作成されるアソシエーションが少なくなりますが、私はそれを実験し始めたばかりです。また、注目したい STR() 関数も見つけました。

4

1 に答える 1