2012-02-17 7 views
0

私は1:Mの関係を持つ2つのテーブルを持っています:Account(Parent)と 'Payment'(Child)。 「支払」テーブルには、「有償」、「有償」、「未支払」のいずれかの値を持つ「タイプ」列があります。すべての勘定科目テーブルレコードとその子レコードを取得するためのSqlクエリ

今、すべてのアカウントテーブルレコードとその子レコードを取得できるクエリを作成する必要があります。しかし、子テーブルでは、親アカウントテーブルに「有償」タイプのレコードが存在するかどうか最初にチェックする必要があります。はいの場合は、それだけを選択します(他のタイプではありません)。 '有料'タイプのレコードが子テーブルに存在しない場合、 '有償'タイプの子レコードがチェックされ、それらのレコードのみがフェッチされます。

答えて

1

と仮定すると、あなたが持っている、少なくとも:

SELECT 
    account.*, payment.* 
FROM 
    account 
    INNER JOIN payment 
     ON (payment.account_id = account.id) 
WHERE payment.type IN ('Paid', 'will-Pay'); 

レコードを '有料' と '意志-ペイ':レコードと同じ答えで '意志・ペイ' レコードを '有料'

CREATE TABLE account (
    id INTEGER NOT NULL PRIMARY KEY 
); 

CREATE TABLE payment (
    account_id INTEGER NOT NULL REFERENCES account(id), 
    type ENUM ('Paid', 'will-Pay', 'Not-paid') 
); 

別の答えの中のレコード:

-- Fetch 'Paid' records 
SELECT 
    account.*, payment.* 
FROM 
    account 
    INNER JOIN payment 
     ON (payment.account_id = account.id) 
WHERE payment.type = 'Paid'; 

-- Fetch 'will-Pay' records 
SELECT 
    account.*, payment.* 
FROM 
    account 
    INNER JOIN payment 
     ON (payment.account_id = account.id) 
WHERE payment.type = 'will-Pay'; 
+0

HI Hochgurgler、私は別に有料またはウィルペイ記録を取りたいとは思わない。口座には、多くの支払いの子レコードが存在する可能性があります。口座に対して、3つの子支払記録があるとします。第1子レコードはWill-payタイプで、残りの2レコードはNot-Paidタイプです。次に、有料のレコードが存在するかどうかを最初に確認します。この場合、それは存在しません。それで、それはWill-payタイプのレコードを選ぶでしょう。しかし、存在する有料のレコードがあれば、そのレコードのみを選択しなければならない。 – user1173496

0

試してみてください。

SELECT p.* 
FROM account a 
INNER JOIN payment p ON p.account_id = a.id 
WHERE p.type = 'Paid' or 
     (p.type = 'will-Pay' and not exists 
     (select null from payment p1 where p1.account_id = a.id and p1.type = 'Paid') 
    ) 
関連する問題