2009-08-28 14 views
0

これは私のクエリです。そして、私はBFのすべての行とFTの一致する行が必要です。 2行しか返しませんが、実際の行数は135です。クエリをどのように変更すればよいですか?SQL Serverの外部結合の問題

SELECT 
    BF.FaturaNo, 
    K.KlinikAdi, 
    FT.teslimAlindi, 
    FT.TeslimAciklama, 
    FT.kurumTeslimAldi, 
    FT.kurumTeslimAciklama, 
    BF.basilmisFatura_id, 
    K.klinik_id 
FROM 
    BasilmisFaturalar AS BF 
LEFT OUTER JOIN 
    FaturaTeslim AS FT 
    ON FT.refBasilmisFatura_id = BF.BasilmisFatura_id 
INNER JOIN 
    Klinikler AS K 
    ON BF.refKlinik_id = K.klinik_id 
INNER JOIN 
    Faturalar AS F 
    ON F.refBasilmisFatura_id = BF.basilmisFatura_id 
WHERE 
     BF.FaturaNo LIKE '%%' 
    AND BF.refklinik_id IN ('24','25','26','27') 
    AND MONTH(F.faturaTarihi) = 7 
    AND teslimAlindi = 0 
    AND kurumTeslimAldi = 0 
GROUP BY 
    F.refBasilmisFatura_id, 
    BF.FaturaNo, 
    K.KlinikAdi, 
    FT.teslimAlindi, 
    FT.TeslimAciklama, 
    FT.kurumTeslimAldi, 
    FT.kurumTeslimAciklama, 
    BF.basilmisFatura_id, 
    K.klinik_id 
ORDER BY 
    faturaNo ASC 

答えて

-1

あなたのWHERE句はおそらくそれよりも制限があります。これらの用語のいくつかを取り出してみてください。

はまた、BF.FaturaNo LIKE '%%'はおそらく、より理解BF.FaturaNo IS NOT NULL

に置き換えてください

コンセプトのシンプルなデモにあなたの問題を減らしてみてください。この質問には、あまりにも多くのデータモデル固有のものが組み込まれています。

+0

_BF.FaturaNo LIKE '%%' _は_BF.FaturaNo IS NOT NULL_と同じです(テストしました)。このクエリは動的に構築されたように見えるので、意図していない可能性があります...そして私は投票の下ではありませんでした!私は彼らが一度に1つずつこのクエリーの部分を取り除き始め、それを実行し続けて結果を見つけ出す必要があると思います。 –

+0

情報をありがとう。私はそれを反映するために私の返信を変更しました。 – recursive

+0

+1 Opはクエリーを減らす必要があると考えています –

2

あなたのteslimAlindiとkurumTeslimAldiフィルターは "OUTER"側にありますので、このBFをINNER JOINに参加させてください。

ON句に参加またはフィルタする前に、まずフィルタリングする必要があります。私はあなたがあなたのwhere句にteslimAllindiとkurumTeslimAldiを持って

.... 
FROM BasilmisFaturalar AS BF 
    LEFT OUTER JOIN 
    (SELECT * 
    FROM 
     FaturaTeslim 
    WHERE 
     teslimAlindi = 0 AND 
     kurumTeslimAldi = 0 
    ) AS FT ON FT.refBasilmisFatura_id = BF.BasilmisFatura_id 
    INNER JOIN Klinikler AS K ON BF.refKlinik_id = K.klinik_id 
    INNER JOIN Faturalar AS F ON F.refBasilmisFatura_id = BF.basilmisFatura_id 
WHERE BF.FaturaNo LIKE '%%' AND 
    BF.refklinik_id IN ('24','25','26','27') AND 
    MONTH(F.faturaTarihi) = 7 
+0

同じ数2 :( – cagin

+1

実際の行数が135であることをどのように知っていますか? – gbn

2

派生テーブルのアプローチこれを好みます。

joinはwhere句の前に実行されます。したがって、FakturaTeslimレコードが存在しないすべての行に対して、TeslimAllindiおよびKurumTeslimAldiは結合後にNULLになります。

これらの行はwhere句でフィルタリングされ、効果的に左側の結合が内側の結合として機能します。

あなたは代わりに、これを書く必要があります。
- すべては、希望取得:

SELECT 
    BF.FaturaNo, 
    K.KlinikAdi, 
    FT.teslimAlindi, 
    FT.TeslimAciklama, 
    FT.kurumTeslimAldi, 
    FT.kurumTeslimAciklama, 
    BF.basilmisFatura_id, 
    K.klinik_id 
FROM 
    BasilmisFaturalar AS BF 
LEFT OUTER JOIN 
    FaturaTeslim AS FT 
    ON 
    (FT.refBasilmisFatura_id = BF.BasilmisFatura_id 
    AND teslimAlindi = 0 
    AND kurumTeslimAldi = 0) 
INNER JOIN 
    Klinikler AS K 
    ON BF.refKlinik_id = K.klinik_id 
INNER JOIN 
    Faturalar AS F 
    ON F.refBasilmisFatura_id = BF.basilmisFatura_id 
WHERE 
     BF.FaturaNo LIKE '%%' 
    AND BF.refklinik_id IN ('24','25','26','27') 
    AND MONTH(F.faturaTarihi) = 7 
GROUP BY 
    F.refBasilmisFatura_id, 
    BF.FaturaNo, 
    K.KlinikAdi, 
    FT.teslimAlindi, 
    FT.TeslimAciklama, 
    FT.kurumTeslimAldi, 
    FT.kurumTeslimAciklama, 
    BF.basilmisFatura_id, 
    K.klinik_id 
ORDER BY 
    faturaNo ASC 
2

を句は、それらの非エイリアスの列が何を言っていることは事実である、テーブルFaturaTeslimからあると仮定すると、

AND teslimAlindi = 0 
AND kurumTeslimAldi = 0 

を持っているザ・BasilmisFaturalarからの行
- FaturaTeslimで見つかった行と一致させてください。見つからなければOKです。
- そして、これらの結果を、左外部結合を持つすべての行teslimAlindi <> 0 または kurumTeslimAldi <> 0

を放り出す、一致するものがFaturaTeslimで見つかりませんでしたそれらの行のために、teslimAlindiとkurumTeslimAldiはNULLになりますそれはwhere句で削除されます(= 0でないため)。

gbnのコードスニペットは、外部結合のON句の値をチェックすることで、これを修正する方法を示します。これは、実装するビジネスロジックであるIF(つまり、LOJのFaturaTeslimの場合はteslimAlindi = 0とkurumTeslimAldi = 0

+0

良い説明 – HLGEM

+0

「and」から「...」に3番目の箇条書きを変更しました。 <> 0 OR kurum ... " –