0

我有以下在 SQL Server 中执行的 sql。我得到tx表中行的乘积。tx表中有 6 行,appt表中没有匹配的行。master表有一行包含个人信息,但是当我执行这个 sql 时,我得到 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

Don't mix old style and new style JOINs. In fact, you should avoid old style joins using commas entirely. It's not ANSI standard and can lead to confusing code. According to SQL "master" is being included as a CROSS JOIN to "tx" because you have nothing that relates it to the tx table. The cross join will cause the number of rows returned to be the multiplication product of the two pieces as each repeat for every record. Effectively your current query is this:

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

Part of your issue is that you are missing JOIN types - you are using JOIN syntax and you are also joining the tables with a comma. You syntax should be like the following:

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

So your full query would be:

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

没有看到你的数据很难说,但我猜你看到这些结果是因为tx它本身就加入了。

我很难理解您到底需要什么,但如果包含您当前的数据和所需的输出,我们可能会为您指明正确的方向。

在旁注中,我认为您没有任何理由在其中包含所有这些双引号。如果您删除这些并格式化您的查询,那么这里的人们会更容易帮助您。

于 2012-07-20T16:16:35.100 回答
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 回答
0

主人这个词前面的逗号对我来说不合适。

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 回答