2016-05-29 1 views
1

ビューを作成し、それぞれがカウントを表す3つのカラムを返す3つのSQL文があります。ここで3ビューへのステートメント

は私の文は、私は基本的なビューを作成する方法を知っているが、どのように私は私が

をフィルタリングするために使用するカラムとして、これら3列の場所placeIDを持つようになるものを作成します

SELECT Count(*) 
FROM PlaceEvents 
WHERE PlaceID = {placeID} AND EndDateTimeUTC >= GETUTCDATE() 

SELECT Count(*) 
FROM PlaceAnnouncements 
WHERE PlaceID = {placeID} 

SELECT Count(*) 
FROM PlaceFeedback 
WHERE PlaceID = {placeID} AND IsSystem = 0 

です

SELECT * 
FROM vMyCountView 
WHERE PlaceID = 1 

CREATE VIEW vMyCountView AS 
    (...) AS ActiveEvents, 
    (...) AS Announcements, 
    (...) AS UserFeedback, 
    PlaceID 
+0

はまだ開いてこの問題ですか?さらに助けが必要ですか? SOの回答を得ているほとんどの専門家が評判の点で飢えているという事実にご注意ください。 [これを読んでください:誰かの回答](http://stackoverflow.com/help/someone-answers)。どうも! – Shnugo

答えて

0

これらを複数の選択サブクエリとして組み合わせることができます。

私はむしろ、ビューを機能を使用すると思い
CREATE VIEW vMyCountView AS 
SELECT 
(SELECT Count(*) FROM PlaceEvents 
WHERE PlaceID = s.placeID AND EndDateTimeUTC >= GETUTCDATE()) AS ActiveEvents, 
(SELECT Count(*) FROM PlaceAnnouncements 
WHERE PlaceID = s.placeID) AS Announcements, 
(SELECT Count(*) FROM PlaceFeedback 
WHERE PlaceID = s.placeID AND IsSystem = 0) AS UserFeedback, 
placeID 
from Sometable s 
1

これは、あなたが好きなパラメータに渡すことができます(私はplaceIdがINTであると仮定)とクエリ内それに対処します。表示は非常に簡単です。

CREATE FUNCTION MyCountFunction(@PlaceID INT) 
RETURNS TABLE 
AS 
RETURN 
SELECT 
    (SELECT Count(*) FROM PlaceEvents WHERE PlaceID = @PlaceID AND EndDateTimeUTC >= GETUTCDATE()) AS ActiveEvents 
    ,(SELECT Count(*) FROM PlaceAnnouncements WHERE PlaceID = @PlaceID) AS Announcements 
    ,(SELECT Count(*) FROM PlaceFeedback WHERE PlaceID = @PlaceID AND IsSystem = 0) AS UserFeedback 
    ,@PlaceID AS PlaceID; 
GO 

これはどのように呼び出すかです。あなたはviewは、単一のSELECT文で、定義により

SELECT * FROM dbo.MyCountFunction(3); 
0

... JOIN秒間、あるいはまたAPPLYでこれを使用することができます。 joinunionなどを使用することができます。create viewがバッチ内の唯一のクエリである場合、ビジネスロジックには意味があります。

0

あなたはGROUP BYでそのようなビューを行うことができます。ビューに作ることは非常に容易である

SELECT 
    PlaceId 
, Count(peId) AS ActiveEvents 
, COUNT(paId) AS Announcements 
, COUNT(fbId) AS UserFeedback 
FROM (
    SELECT PlaceId, 1 AS peId, NULL AS paId, NULL AS fbId 
    FROM PlaceEvents 
    WHERE EndDateTimeUTC >= GETUTCDATE() 
UNION ALL 
    SELECT PlaceId, NULL AS peId, 1 AS paId, NULL AS fbId 
    FROM PlaceAnnouncements 
UNION ALL 
    SELECT PlaceId, NULL AS peId, NULL AS paId, 1 AS fbId 
    FROM PlaceFeedback 
    WHERE IsSystem = 0 
) src 
GROUP BY PlaceId 

この選択の背後にある考え方、計数のために一つに3つのテーブルから項目を選択することであり、それらを一度にまとめてください。

次の2つのアクティブなイベント、1つの告知、および場所のID 123のための3つのフィードバックを持っている場合は、次の3つの内側の選択は、この生成します:

PlaceId peId paId fbId 
------- ---- ---- ---- 
    123  1 NULL NULL 
    123  1 NULL NULL 
    123 NULL  1 NULL 
    123 NULL NULL  1 
    123 NULL NULL  1 
    123 NULL NULL  1 
関連する問題