2

複数のテーブルを持つデータベースを作成しました。

私の問題に関連する表:

プロファイルテーブル http://imageshack.us/photo/my-images/838/profileqw.jpg/ すべてのporfileを保存します

SalaryGroupテーブル http://imageshack.us/photo/my-images/255/salarygroup.jpg/ すべての給与を保存します

ProfileSalaryGroupshttp : //imageshack.us/photo/my-images/138/profileandsalary.jpg/ 接続されているプロファイルと給与を保存します

プロファイル/給与などを挿入するいくつかのストアドプロシージャがあります。プロファイルと給与を接続し、それらを「profileSalaryGroups」テーブルに格納するプロシージャがあります。また、特定のプロファイルに関連するすべての給与を取得する手順もあります。

これらの手順は、以下を実行します。

プロファイルと給与手順を接続します(完全に機能します):

ALTER PROCEDURE [dbo].[ConnectProfileAndSalary]
    -- Add the parameters for the stored procedure here
    @ProfileName varchar(50) = '', 
    @Salaryname varchar(50) = ''
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    DECLARE @pId int
    DECLARE @sId int
    SELECT @pId =  Id from [Profile] where Name = @ProfileName
    SELECT @sId =  Id from SalaryGroup where Name = @Salaryname

    -- If the Id number already exists
    IF ((SELECT COUNT(*) FROM ProfileSalaryGroups WHERE SalaryGroupId = @sId) > 0 OR
        (SELECT COUNT(*) FROM ProfileSalaryGroups WHERE ProfileId = @pId) > 0)  
        RAISERROR ('Connection Exists', -- Message text.
                    16, -- Severity.
                    1 )
    ELSE
    INSERT INTO ProfileSalaryGroups (SalaryGroupId,ProfileId ) VALUES (@sId, @pId)
END

特定のプロファイルに接続されているすべての給与を取得します(完全に機能します):

ALTER PROCEDURE [dbo].[GetConnectedSalaries]
    -- Add the parameters for the stored procedure here
    @ProfId int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT SalaryGroupId, s.Name from ProfileSalaryGroups ps
    INNER JOIN SalaryGroup as s on s.Id = ps.SalaryGroupId
    Where ps.ProfileId = @ProfId
END

問題:

プロファイルに接続されていないすべてのサラリーIDと名前を取得するプロシージャを作成しようとしています。

私はこれに対していくつかのアプローチを試しました。例:

SELECT SalaryGroupId, s.Name from ProfileSalaryGroups ps
    INNER JOIN SalaryGroup as s on s.Id = ps.SalaryGroupId
    Where ps.ProfileId != @ProfId

これは私が欲しいものの半分を私に与えます。このプロファイルに接続されていないすべての給与を取得したいのですが、このコードは、プロファイルに接続されているが、パラメーターとして送信したものには接続されていないすべての給与IDと名前を返します。すべてが含まれているわけではありません。 「SalaryGroup」テーブルに存在する給与

SELECT s.Id, s.Name from SalaryGroup s
    where NOT EXISTS (SELECT SalaryGroupId, s.Name, s.Id from ProfileSalaryGroups ps
    INNER JOIN SalaryGroup as s on s.Id = ps.SalaryGroupId
    Where ps.ProfileId = 17
    )

これは何も返しませんでした。

私はしばらくこれにいて、他のいくつかのアプローチを試みました(場合によっては笑える)、そして私は立ち往生しています、より多くの情報が必要な場合は尋ねてください、そして私はそれを提供するために最善を尽くします。

タイトルが正しくなかった場合は申し訳ありませんが、この問題のタイトルをどうすればよいかわかりませんでした。@Adminの方が適切なタイトルを念頭に置いている場合は、自由に変更してください。

ありがとうございました!

4

4 に答える 4

0

左の結合でこれを行い、結合の右側で結果が得られない場所を探すことができます。

SELECT 
  s.Id, 
  s.Name 
from SalaryGroup  s
left JOIN ProfileSalaryGroups as ps 
on s.Id = ps.SalaryGroupId
Where ps.SalaryGroupId is null

これにより、すべての給与IDと名前が取得されますが、SalaryGroupに一致するレコードがある場所(つまり、s.profileIdがnullでない場所)は削除されます。

于 2013-02-28T11:07:18.663 に答える
0

左外側結合はあなたが望むことをするはずです:

select * 
   from SalaryGroup sal
   left outer join ProfileSalaryGroups prof on
        prof.Id = sal.Id
   where prof.Id is null or prof.ProfileId != @ProfId

説明:ここでは、プロファイルがまったくないものprof.Id is nullprof.ProfileId != @ProfId選択し、プロファイルはあるが現在のプロファイルと一致しないものを選択します。

于 2013-02-28T11:10:21.790 に答える
0

簡単に始めて、問題に取り組みます。

まず、すべてのsalaryIDを取得します

select * 
from SalaryGroup s
left join ProfileSalaryGroup ps on ps.salaryGroupID=s.ID

さて、それらすべてが必要ではないので、それらのいくつかを削除する方法を検討してください。
パラメーターに一致するグループを削除するには、where句を追加します。

where ps.profileID <> @parameter

ここで、プロファイルと以下を一致させずにsalaryGroupsを削除したい場合

and ps.ProfileID is NULL

(INNER JOINではなく)左結合は、2番目のテーブルに一致するデータがあるかどうかに関係なく、常に行を返すようにSQLに指示します。SQLが一致するものを見つけられない場合、2番目のテーブルのデータ列はすべてNULLになります。WHERE句の最初の部分は、パラメータに一致しない行のみを返します。2番目の部分は、プロファイル給与データのない行を返します

于 2013-02-28T11:10:40.637 に答える
0

パラメーターを LEFT JOIN の条件として配置ps.SalaryGroupId IS NULLし、WHERE 句をチェックインします

SELECT s.Id, s.Name 
FROM SalaryGroup as s LEFT JOIN ProfileSalaryGroups ps on s.Id = ps.SalaryGroupId
                                  AND ps.ProfileId = @ProfId
WHERE ps.SalaryGroupId IS NULL
于 2013-02-28T11:17:37.213 に答える