2017-10-29 14 views
0

AdventureWorks2014のデータを使用して、新しいデータベースに3つのビューを作成しました。 3つのビューはすべてコンパイルされ保存されますが、問題はありません。しかし、3つすべてを含めて1つの完全なビューを作成しようとすると、何も動作していないようです。以前のビューをSQLで統合したビューを作成

ビューcreationcreation2creation3:私はスタックに読んだとして

ALTER VIEW [creation] AS 
SELECT sd.ProductID, YEAR(sh.OrderDate) AS 'Year', 
MONTH(sh.OrderDate)AS 'Month', DAY(sh.OrderDate) AS 'Day', 
sd.UnitPrice AS 'Value', sd.OrderQty AS 'Quantity', NULL AS 'col7', 
NULL AS 'col8' 
FROM AW2014.Sales.SalesOrderHeader AS sh 
INNER JOIN AW2014.Sales.SalesOrderDetail AS sd 
ON sd.SalesOrderID = sh.SalesOrderID 
INNER JOIN AW2014.Sales.Customer AS c 
ON c.CustomerID = sh.CustomerID 
INNER JOIN AW2014.Person.Person AS p 
ON p.BusinessEntityID = c.PersonID 
WHERE p.PersonType LIKE 'IN' 

ALTER VIEW [creation2]AS 
SELECT p.FirstName, p.MiddleName, p.LastName, 
CONCAT(a.AddressLine1, ' ',a.AddressLine2,', ',a.City) AS 'Address', 
cr.Name, NULL AS 'col6', NULL AS 'col7', NULL AS 'col8' 
FROM AW2014.Person.Person AS p 
INNER JOIN AW2014.Person.BusinessEntityAddress AS bea 
ON p.BusinessEntityID= bea.BusinessEntityID 
INNER JOIN AW2014.Person.Address AS a 
ON bea.AddressID = a.AddressID 
INNER JOIN AW2014.Person.StateProvince AS sp 
ON a.StateProvinceID = sp.StateProvinceID 
INNER JOIN AW2014.Person.CountryRegion AS cr 
ON sp.CountryRegionCode = cr.CountryRegionCode 
WHERE p.PersonType LIKE 'IN' 

ALTER VIEW [creation3] AS 
SELECT DISTINCT p1.ProductID, p1.Name AS 'Product', pc.Name AS 'Category', 
sc.Name AS 'Subcategory', 
p1.StandardCost, p1.Color, p1.Weight, CONCAT(p1.SizeUnitMeasureCode,', ',p1.WeightUnitMeasureCode) AS 'Units' 
FROM AW2014.Production.Product AS p1 
INNER JOIN AW2014.Production.ProductSubcategory AS sc 
ON p1.ProductSubcategoryID = sc.ProductSubcategoryID 
INNER JOIN AW2014.Production.ProductCategory AS pc 
ON pc.ProductCategoryID = sc.ProductCategoryID 
INNER JOIN AW2014.Sales.SalesOrderDetail AS sd 
ON p1.ProductID = sd.ProductID 
INNER JOIN AW2014.Sales.SalesOrderHeader AS sh 
ON sd.SalesOrderID = sh.SalesOrderID 
INNER JOIN AW2014.Sales.Customer AS c 
ON sh.CustomerID = c.CustomerID 
INNER JOIN AW2014.Person.Person AS p 
ON c.PersonID = p.BusinessEntityID 
WHERE p.PersonType LIKE 'IN' 

私はすべてのビューを作ったが、私はunionステートメントを使用する必要がある場合は、列の同じ量を持っています。私はこのようにした:

CREATE VIEW [a] AS 
SELECT * FROM [creation2] 
UNION ALL 
SELECT * FROM [creation] 

私は私のコマンドが正常に完了したというメッセージが表示されます。しかし、私がSELECT * FROM [a]にしようとすると、結果は無限に実行されます。ドロップダウンメニューでdbo.aをチェックした後、最初のビュー(この場合はcreation2)のものだけが表示されます。これは、unionまたはunion allステートメントを無視する(または実行できない)かのようです。

JOINを使用して、それぞれのビューにp.PersonType列を追加してそれらを結合しようとしました。私はそれらを選択していた限りうまくいっていましたが、それらを新しいビューに入れようとしたとき、ビューには別個のカラムが必要であるというエラーが発生しました。もし私がそれにすべて参加したいのであれば、それを明確にすることはできないのですか? いずれにしても、私の質問は立っています。上記3つのオプションをすべて失敗したと考えて、3つの意見をすべて新しいものに入れてもいいですか?多分あなたはいくつかのヒントを持っています、多分私のコードでいくつかの間違いを犯しましたか?以前はSQLを使用していましたが、何年も前からSQLを使用していました。

私はMicrosoft SQLServer Management Studio 2017 btwを使用しています。ありがとうございました!

+0

コードは問題ありません。ビューは機能しています。最適化はあなたが期待するものではありません。返される行は、最初のビューから来る傾向があります。 。 。もっと見るにはスクロール(たくさん)しなければならないかもしれません。 –

+0

異なる列とタイプのものは結合できません。彼らが同じでない場合は、ビューも作成されたことを奇妙に思う。あなたが達成しようとしていることを、なぜこれがうまくいかないのか不思議ではなく、特にあなたが非常に異なるものである組合や結合を試しているのであれば、説明することができます。 –

+0

@GordonLinoffはい、私はスクロールする場所がありませんか?新しいビュー[a]は私に何も表示されません。それを選択しても実行されません。そして、私のデータベースのドロップダウンメニューでは、私はすべての列を見ることができます(それらのうちの8つだけです)。そしてそれらは[creation2]からちょうどです:( – Jake

答えて

0

UNION ALLの代わりに、関連のないビューの結果を連結するのは適切でないため、3つのビューで公開される列に参加する必要があります。

重複する列名になるビューでは、SELECT *を使用することはできません。とにかく明示的な列リストを指定し、必要に応じて異なるテーブルから返された列を区別するために列別名を指定することをお勧めします。上記の例のような意味のあるビュー名も示唆しています。これは、適切なクエリの関係を理解し​​やすくするためです。

ジョインを含むクエリで簡単にビューを使用するには、各ビューでは、通常、行を一意に識別する1つ以上の列(表の主キーなど)が表示されます。 PersonTypeはいずれのビューでも一意ではないため、多対多の結合が発生し、多くの行が返されます。この場合、その結合は論理的に意味をなさない。結合は、一般に1対1または1対多の関係でなければなりません。

関連する問題