2012-07-20 60 views
0

我有以下SQL,我在SQL Server中執行。我在tx表中獲得了行的乘積。 tx表中有6行,appt表沒有匹配的行。 master表有一行與個人信息,但是當我執行這個SQL時,我得到36行,而不是每條記錄獲得一行。我得到這個人的行數行數。我知道我需要的where條款,但沒有在我試圖作品的另一個條件:sql返回行中的行而不是實際在表中的行

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

什麼是所有的雙引號? – 2012-07-20 16:12:29

+2

爲什麼在'FROM'子句中使用逗號和'JOIN'運算符? – 2012-07-20 16:14:33

+3

你如何閱讀該查詢?它讓我癲癇發作。我覺得有諷刺意味的是那裏有一個名爲「昏迷」的專欄。 – 2012-07-20 16:14:55

回答

0

很難沒有看到你的數據說,但我猜,因爲tx是左側的接合部在您看到這些結果本身。

我很難理解你究竟需要什麼,但是如果包括你當前的數據和你想要的輸出,我們可能會指出你在正確的方向。

在附註上,我看不出有任何理由讓你在那裏有所有的雙引號。如果你刪除這些信息並設置你的查詢格式,這裏的人們可以更容易地幫助你。

0

啊,輸入回答的變幻莫測太快了。由於連接的結構,原始查詢產生了太多的記錄,該連接使用左側外部構造。很顯然,交叉連接創建了每個涉及表的交叉產品。

+2

您解釋了交叉連接。左連接表示左表中的所有行和右表匹配的行。如果右表中沒有匹配的行,那麼這些行將作爲右值爲空表列。 – 2012-07-20 16:19:06

+0

我是新來的ansi sql和我習慣使用舊的SQL,但這裏是實際需要做的事情,修復了這個問題: – jur 2012-07-20 16:40:50

+0

抱歉按下輸入太快fROM tx LEFT OUTER JOIN appt ON tx.appt_key = appt.appt_key INNER JOIN master master.master.master_key = tx.master_key WHERE master.master_key = CAST(71563。00爲數字(10,2)) 和master.master_key = tx.master_key ORDER BY tx.time ASC,ASC tx.appt我 – jur 2012-07-20 16:41:35

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 
+0

這仍然返回36行 – jur 2012-07-20 16:26:33

+0

我完成所有變更建議,但仍然得到36行 – jur 2012-07-20 16:30:32

+0

什麼,你在這裏做的是,第一連接與高手TX因此你有6行後加入上master_key,我相信所有的6行具有相同的主密鑰。然後,這個輸出與tx表連接,這是同一個表,因此具有相同的主密鑰。因此,tx左連接主機的輸出給出具有相同主密鑰值的6行,如1,然後再次它再次與tx連接,並且它有6行,每行的主密鑰爲1,因此您有6 * 6 = 36行,因此,etx左連接主節點的每一行都與tx1匹配。 – 2012-07-20 16:34:19

0

不要將舊風格和新風格的聯接。事實上,你應該完全避免使用逗號的舊式連接。這不是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 
0

您的問題的部分原因是,你缺少的連接類型 - 您使用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 
+0

無論我嘗試我得到36行,我知道是不正確的,因爲當我只從tx表中選擇這個傢伙,我只得到6行,主人只有1行和APPT沒有行某種tx和tx1加入和IM獲得產品 – jur 2012-07-20 16:36:43

+0

你能用一些示例數據創建一個[SQL小提琴](http://sqlfiddle.com/)嗎? – Taryn 2012-07-20 16:45:51

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" 
相關問題