1

私は右外側の結合を持っています、それはほとんど私が望むことをします...

SELECT
users_usr.firstname_usr,
users_usr.lastname_usr,
credit_acc.given_credit_acc,
users_usr.created_usr,
users_usr.sitenum_usr,
users_usr.original_aff_usr,
users_usr.id_usr
FROM
credit_acc
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr

問題は、追加したい

where credit_acc.type_acc = 'init'

しかし、これにより、credit_accに行がないすべてのユーザーが削除されます...これが、右外部結合が必要な理由です。

2つのクエリと1つのユニオンを実行せずにこれを取得する方法はありますか?

4

6 に答える 6

4
SELECT
users_usr.firstname_usr,
users_usr.lastname_usr,
credit_acc.given_credit_acc,
users_usr.created_usr,
users_usr.sitenum_usr,
users_usr.original_aff_usr,
users_usr.id_usr
FROM
credit_acc
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr
WHERE credit_acc.type_acc = 'init' OR credit_acc.type_acc is NULL

または、@Tomalakが指摘したように:

WHERE COALESCE(credit_acc.type_acc, 'init') = 'init'

より高速になる可能性があります(コメントを参照)。

于 2008-11-13T17:39:00.997 に答える
2

行が存在しない場合、credit_acc.type_accは null である必要があります。次のようなことを試すことができます:

WHERE credit_acc.type_acc = 'init' OR credit_acc.type_acc IS NULL;

credit_acc.type_accに null フィールドがない場合にのみ機能します。

于 2008-11-13T17:42:03.550 に答える
1

次のことを試しましたか?

SELECT
users_usr.firstname_usr,
users_usr.lastname_usr,
credit_acc.given_credit_acc,
users_usr.created_usr,
users_usr.sitenum_usr,
users_usr.original_aff_usr,
users_usr.id_usr
FROM
credit_acc
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr and credit_acc.type_acc = 'init'
于 2008-11-13T17:41:20.353 に答える
0

私は述語を作ります:

WHERE credit_acc.uid_usr IS NULL OR credit_acc.type_acc = 'init'

これにより、UID_USRに一致するものがない行と、一致するものがあり、アカウントタイプが「init」である行が得られます。

提案された他のソリューション(type_accのNULLをチェック)でも、UID_USRに一致があり、アカウントタイプの実際の値がNULLである行が表示されます。

credit_acc.type_accをNULLにすることができない場合、2つの間に違いはありません。可能であれば、それらの行を結果セットに含めるかどうかを決定する必要があります。

于 2008-11-13T18:54:29.847 に答える
0

結合条件に別の述語を追加するだけです。

SELECT  U.firstname_usr, U.lastname_usr, C.given_credit_acc, 
        U.created_usr, U.sitenum_usr, U.original_aff_usr, U.id_usr
From credit_acc C Right Join users_usr U
   On C.uid_usr = U.id_usr
      And C.type_acc = 'init'

これは、「外部」結合の「反対側」からの一致しないレコードが結果セットに追加される前に結合条件が適用されるのに対し、2 つのテーブルが結合された後に Where 条件が適用されるためです...

この構文は、あなたの意図もより明確に表しています...

于 2008-11-13T19:14:54.720 に答える
0

user-id で結合された 2 つのテーブルのすべてのレコードが必要ですか? どこで credit_acc が 'init' であるか、または結合する credit_acc 行がない場所ですか? どうですか

where credit_acc.type_acc is null  OR credit_acc.type_acc = 'init'
于 2008-11-13T17:45:27.007 に答える