0

SQL Serverで実行する次のSQLがあります。テーブル内の行の積を取得しtxます。txテーブルには 6 つの行があり、apptテーブルには一致する行がありません。masterテーブルには個人情報を含む 1 つの行がありますが、この sql を実行すると、レコードごとに 1 行ではなく 36 行が得られます。この男の行数の行数を取得します。句に別の条件が必要であることはわかっていますが、where試したことはありません。

SELECT "tx"."today",
       "tx"."ada_no",
       "tx"."tth_no",
       "tx"."surface",
       "tx"."billed",
       "tx"."ins_pays",
       "tx"."ins_pays1",
       "tx"."balance1",
       "tx"."dr_no",
       "tx"."status",
       "tx"."coma",
       "tx"."comb",
       "tx"."notes",
       "tx"."appt",
       "tx"."w_date",
       "tx"."thekey",
       "tx"."service",
       "tx"."time",
       "appt"."doa",
       "master"."wip",
       LEFT(ampm, 1) AS premed,
       "master"."med_hx",
       "tx"."comc",
       "tx"."comd",
       "tx"."i_bal2",
       "tx"."ins_pays2",
       "tx"."i_bal3",
       "tx"."ins_pays3"
FROM   "tx"
       LEFT OUTER JOIN "appt"
         ON "tx"."appt_key" = "appt"."appt_key",
       "master"
       LEFT OUTER JOIN "tx" tx1
         ON "master"."master_key" = "tx1"."master_key"
WHERE  "master"."master_key" = CAST(71563.00 AS NUMERIC(10, 2))
       AND "master"."master_key" = "tx"."master_key"
ORDER  BY "tx"."time" ASC,
          "tx"."appt" ASC 
4

6 に答える 6

0

問題の一部は、JOINタイプが欠落していることです。JOIN構文を使用しており、テーブルをコンマで結合しています。構文は次のようになります。

FROM tx 
LEFT OUTER JOIN appt 
  ON tx.appt_key = appt.appt_key
LEFT JOIN master 
   ON master.master_key = tx.master_key
LEFT OUTER JOIN tx tx1
  ON master.master_key = tx1.master_key

したがって、完全なクエリは次のようになります。

SELECT  tx.today
  , tx.ada_no 
  , tx.tth_no 
  , tx.surface
  , tx.billed 
  , tx.ins_pays 
  , tx.ins_pays1 
  , tx.balance1 
  , tx.dr_no
  , tx.status 
  , tx.coma
  , tx.comb 
  , tx.notes 
  , tx.appt 
  , tx.w_date 
  , tx.thekey 
  , tx.service 
  , tx.time
  , appt.doa 
  , master.wip
  , left(ampm,1) as premed
  , master.med_hx
  , tx.comc
  , tx.comd 
  , tx.i_bal2
  , tx.ins_pays2
  , tx.i_bal3
  , tx.ins_pays3
FROM tx 
LEFT OUTER JOIN appt 
  ON tx.appt_key = appt.appt_key
LEFT JOIN master 
   ON master.master_key = tx.master_key
LEFT OUTER JOIN tx tx1
  ON master.master_key = tx1.master_key
WHERE master.master_key = CAST(71563.00 AS NUMERIC(10,2)) 
ORDER BY tx.time ASC
  , tx.appt ASC
于 2012-07-20T16:26:14.047 に答える
0

古いスタイルと新しいスタイルのJOINを混在させないでください。実際、コンマを使用した古いスタイルの結合は完全に避ける必要があります。これはANSI規格ではなく、コードを混乱させる可能性があります。SQLによると、「マスター」は「tx」へのクロス結合として含まれています。これは、txテーブルに関連するものがないためです。クロス結合により、返される行数は、レコードごとに繰り返される2つの部分の乗算積になります。事実上、現在のクエリは次のとおりです。

SELECT     tx.today, tx.ada_no, tx.tth_no, tx.surface, tx.billed, tx.ins_pays, tx.ins_pays1, tx.balance1, tx.dr_no, tx.status, tx.coma, tx.comb, tx.notes, tx.appt, 
                      tx.w_date, tx.thekey, tx.service, tx.time, appt.doa, master.wip, LEFT(ampm, 1) AS premed, master.med_hx, tx.comc, tx.comd, tx.i_bal2, tx.ins_pays2, 
                      tx.i_bal3, tx.ins_pays3
FROM         tx LEFT OUTER JOIN
                      appt ON tx.appt_key = appt.appt_key CROSS JOIN
                      master LEFT OUTER JOIN
                      tx AS tx1 ON master.master_key = tx1.master_key
WHERE     (master.master_key = 71563.00) AND (master.master_key = tx.master_key)
ORDER BY tx.time, tx.appt
于 2012-07-20T16:22:33.203 に答える
0

あなたのデータを見ずに言うのは難しいですが、私はあなたがこれらの結果を見ていると推測していますtx.

正確に何が必要かを理解するのに苦労していますが、現在のデータと目的の出力を含めると、おそらく正しい方向に向けることができます.

余談ですが、これらすべての二重引用符をそこに含める理由はわかりません。それらを削除してクエリをフォーマットすると、ここにいる人々があなたを助けやすくなります.

于 2012-07-20T16:16:35.100 に答える
0

master という単語の直前のコンマは、私には場違いに見えます。

FROM   "tx"        
LEFT OUTER JOIN "appt"          
  ON "tx"."appt_key" = "appt"."appt_key",   -- try without this comma     
"master"        
LEFT OUTER JOIN "tx" tx1          
  ON "master"."master_key" = "tx1"."master_key" 
于 2012-07-20T16:31:34.617 に答える
0

ああ、あまりにも速く答えを入力する気まぐれ。元のクエリでは、左外部構造を使用する結合の構造が原因で、生成されるレコードが多すぎました。明らかにクロス結合は、関連する各テーブルの外積を作成します。

于 2012-07-20T16:17:21.277 に答える
0

これを試して

FROM "tx" LEFT OUTER JOIN "appt" ON "tx"."appt_key" = "appt"."appt_key" inner join
"master" 
on "master"."master_key" = CAST(71563.00 AS NUMERIC(10,2))  
AND "master"."master_key" = "tx"."master_key" 
LEFT OUTER JOIN "tx" tx1 ON "master"."master_key" = "tx1"."master_key"      

ORDER BY "tx"."time"          ASC,           "tx"."appt"          ASC 
于 2012-07-20T16:17:38.290 に答える