sql返回行的产品而不是实际在表中的行

时间:2012-07-20 16:10:18

标签: sql sql-server

我有以下在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 

6 个答案:

答案 0 :(得分:0)

很难说没有看到你的数据,但我猜你看到了这些结果,因为tx正在加入。

我很难理解你究竟需要什么,但如果包含你当前的数据和你想要的输出,我们可能会指出你正确的方向。

另一方面,我认为你没有任何理由在那里加上所有那些双引号。如果你删除这些并格式化查询,那么这里的人们会更容易帮助你。

答案 1 :(得分:0)

啊,太快就输入答案的变幻莫测。原始查询由于连接的结构而生成了太多记录,该连接使用左外部构造。显然,交叉连接会创建每个相关表的叉积。

答案 2 :(得分: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 

答案 3 :(得分:0)

不要混合旧样式和新样式JOIN。实际上,您应该完全使用逗号来避免旧式连接。它不是ANSI标准,可能导致令人困惑的代码。根据SQL,“master”作为CROSS JOIN包含在“tx”中,因为你没有任何东西将它与tx表相关联。交叉连接将导致返回的行数为每个记录的每个重复的两个部分的乘积。有效地,您当前的查询是这样的:

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

答案 4 :(得分: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

答案 5 :(得分: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"