2016-09-05 3 views
-1

特定のテーブルを作成しようとするといくつかの問題が発生しています。私はすでにこのサイトでいくつかの似たような答えを読んだことがありますが、私は彼らの答えを理解しているかどうか、そして/またはそれが私の問題にどのように適用されているか分かりません。T-SQLで条件付き選択に問題が発生する

私はレシピ(下の表の定義)のための成分が含まれている既存のテーブルを持っている:私はすべてのレシピで使用されるすべての成分の名前が含まれているテーブルの内容を作成して表示するようにしようとしている

Create Table Recipes.dbo.IngredientsByRecipeID 
(
     RecipeID int, 
     IngredientName varchar(max), 
     UnitTypeOfIngredient varchar(max), 
     QuantityOfIngredient decimal(6,3) 
); 

アルファベット順に、すべての重複したエントリが削除されています。

実装方法に関するいくつかのバリエーションを試しましたが、私の実装やSQL Serverの動作に関する問題が発生しているかどうかはわかりません(T- SQLとその方法)。

次のように新しい、重複のないテーブルにアルファベット順に成分をソートするための私の方法は次のとおりです。

/*these three lines represent code which I've been trying to use to control the problems I keep getting with tables existing or not existing, I don't know if they are really helping or not. The first two only drop and create the table, the second is one attempt at a working solution for my needs*/ 

--drop table AlphabeticallySortedIngredientsList; 
--create table AlphabeticallySortedIngredientsList (IngredientName varchar(max)); 
--select IngredientName into AlphabeticallySortedIngredientsList from IngredientsByRecipeID where ((select count(IngredientName) from AlphabeticallySortedIngredientsList) = 0) order by IngredientName asc; 

--here is my latest attempt at getting a working solution for my needs 

select IngredientName 
into AlphabeticallySortedIngredientsList 
from IngredientsByRecipeID 

where not exists (select * 
        from AlphabeticallySortedIngredientsList 
        where IngredientName = AlphabeticallySortedIngredientsList.IngredientName) 

order by IngredientName asc; 

各実装では、私が最初に構文エラーのいくつかの種類を持っていましたが、(明らかに)それらをクリーンアップした後、エラーは、私はいつも最後のエラーが1つ残っており、入力に基づいてエラーが変化する間、同じオブジェクトがエラーを引き起こしています。

Msg 2714, Level 16, State 6, Line 9
There is already an object named 'AlphabeticallySortedIngredientsList' in the database.

Msg 208, Level 16, State 1, Line 5
Invalid object name 'AlphabeticallySortedIngredientsList'.

私も「を作成テーブルAlphabeticallySortedIngredientsList」行のコメントを外した場合は、その後、私はこのエラーを取得する:私はコメントを外し、上から「ドロップテーブルの行を残す場合は、このエラーが私が手であります

そして、私はテーブルを削除して、両方の行をコメントアウトした場合、私は上記と同じエラーを取得:

Msg 2714, Level 16, State 6, Line 9
There is already an object named 'AlphabeticallySortedIngredientsList' in the database.

私が「AlphabeticallySorにIngredientNameを選択するようだと、私は困惑していtedIngredientList '行は、テーブルを作成しているかどうかを判断できません。私の解決策が実行される前にテーブルをドロップすると、見つからないと言います。ソリューションを実行する前にテーブルを作成すると、テーブルがすでに存在していると表示されます。

私は、ステートメントの '選択'部分がAlphabeticallySortedIngredientsList(存在しないと仮定して)を作成していますが、条件付きでAlphabeticallySortedIngredientsListの値を検索しようとしていますそれを作成する操作はまだ行われていません。私はこの評価で適切な道を歩んでいますか?そうであれば、どうすれば問題を解決できますか?

レコードのIngredientsByRecipeIDの元の内容を保持する必要があります。 AlphabeticallySortedIngredientListは、IngredientsByRecipeIDからすべての成分のきれいで整然としたリストを提示する目的のみを果たします。

私は条件付きを削除すると( 'where'句をコメントアウトすると)、select intoはエラーなしで動作することにも言及する必要があります。これは、drop tableとcreate tableの両方がコメントアウトされており、AlphabeticallySortedIngredientListテーブルがデータベースに既に存在していません。

重複を削除せずにすべてをテーブルに追加してから重複を削除して削除する方がいいでしょうか?私の問題は、すべてを1つのステップでやろうとしているかもしれません。

+0

insert TABLENAME select .... from TABLE – Ben

+0

注意:AlphabeticallySortedIngredientList'テーブルがすでに存在していて、それに挿入していても、SQL文は本質的にトランザクショナルなので重複を排除する方法は機能しません。つまり、いろいろなことを意味しますが、関連するものは、* **中間** *州*という概念はありません。つまり、SQLステートメントが見ることができる唯一のdb/dataステートは、ステートメントが開始されたときに存在していたものです。この理由から、 'DISTINCT'や' GROUP BY'のような機能がSQLに含まれています。 – RBarryYoung

+0

カップルの指針。あなたのサブクエリは、各成分がそれ自身の重複であると考えていたでしょう。そして、それが正しく相関していても、それは当てはまります。一般に、結果を挿入するためのソートの理由もありません。 – shawnt00

答えて

1
Create table Ingredients 
(ingredient varChar(50) primary key not null) 

Insert Ingredients(Ingredient) 
Select distinct IngredientName 
From IngredientsByRecipeID 
1

はい、あなたは正しい方向にあります。 SELECT ... INTOステートメントは、SELECT式に基づいてテーブルを作成します。途中でWHERE NOT EXISTS節にアクセスしようとすると、競合が発生しています。

WHERE NOT EXISTSに依存せずに重複を削除するには、SELECT DISTINCTまたはGROUP BY句を使用します。

2

SELECT/INTOシンタックスで新しいテーブルが作成されます。これを使用して、作成しているテーブルをWHERE句で参照することはできません。テーブルを作成する前に、SELECT句にDISTINCTという句を使用して重複を削除したいとします。既存のテーブルを使用する必要がある場合は、挿入する値がSELECT句であるINSERTステートメントを使用します。表の順序を名前で保持する必要がある場合は、その名前を主キーとする必要があります。これで一意のエントリが必要なので、おそらくこれが必要です。

SELECT DISTINCT IngredientName 
INTO AlphabeticallySortedIngredientsList 
FROM IngredientsByRecipeID 

ADD CONSTRAINT PK_AlphabeticallySortedIngredientsList PRIMARY KEY CLUSTERED (IncredientName) 

通常、既存のテーブルからデータを取得できるので、このテーブルを保持することはお勧めしません。別々のテーブルにデータを保持すると、それらのテーブルを同期させて定期的に更新する必要があります。別のテーブルに名前を保持する場合は、Id列を追加してから、別の(元の)テーブルを名前のIdで更新し、そこから名前列を削除する必要があります。名前Idの列に外部キー制約を追加します。そこに名前を追加してレシピにリンクする必要があります。

+0

さて、私は正しいことを考えていた。私は「Select Distinct」が存在することに気づいていませんでした。私はセレクトでいくつかの異なるマニュアルを読んだが、それを見たことはなかった。それは確かに物事をより簡単に!この件に関する私の混乱を和らげるために、すべてのポスターに感謝します。 – user2828965