6

MS SQL Server 2008 R2を使用していて、ユーザーテーブルに対するクエリに挿入したスプレッドシートからの電子メールのリストがあります。リスト内の821通の電子メールのうち、759行が返されました。テーブルにないメールを返す簡単な方法はありますか?私はデータベースへの読み取りアクセスしか持っていないので、メーリングリストでテーブルを作成することはできません-結果を得るだけです。これは、そこにあった電子メールのリストを取得するために使用したクエリの簡略化されたバージョンです。

select *
from UserTbl
where username in ('email1','email2','email3',...'email821')

Unixシェルソリューションを思いつくこともできますが、MSSQLでそれを行う方法を知っているとはるかに便利です。私は実際にstackoverflow( "T-SQL:テーブルにない値リストの値を選択する方法?")から解決策に近いものを見つけましたが、それは私にはうまくいかなかったようです(私のニーズのために私は欲しいだけですテーブル出力にないもののリスト):

SELECT username,
    CASE
        WHEN EXISTS(SELECT * FROM UsersTbl tu WHERE E.email = tu.username) THEN 'Exist'
        ELSE 'Not Exist'
    END AS
FROM (VALUES('email1'),('email2'),('email3'),('email4')) E(email)

これにより、クエリを実行したときに「キーワード「FROM」の近くの構文が正しくありません」というエラーが発生しました。余談ですが、私は上で使用したVALUESキーワードの説明を探し回っていましたが、何も役に立ちませんでした。

誰かがこれについて私を助けることができればそれは大いにありがたいです。

ありがとう、ベン

4

4 に答える 4

16

まだ存在していない電子メールのリストだけが必要な場合は、次のようにする方がはるかに簡単です。

SELECT e.email
FROM 
(
  VALUES('email1'),('email2'),('email3'),('email4')
) AS e(email)
WHERE 
NOT EXISTS
(
  SELECT 1
    FROM dbo.UsersTbl 
    WHERE username = e.email
);

またはさらに簡単です:

SELECT e.email 
FROM 
(
  VALUES('email1'),('email2'),('email3'),('email4')
) AS e(email)
EXCEPT
SELECT username FROM dbo.UsersTbl;

なぜ私がNOT EXISTS/EXCEPTよりも、LEFT JOINまたは他の代替手段を好むのかを確認するには、以下を参照してください。

http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join

于 2013-01-23T18:00:33.003 に答える
4

「AS」の後にエイリアスが欠落しているようです

SELECT username,
    CASE
        WHEN EXISTS(SELECT * FROM UsersTbl tu WHERE E.email = tu.username) THEN 'Exist'
        ELSE 'Not Exist'
    END AS doesExist
FROM (VALUES('email1'),('email2'),('email3'),('email4')) E(email)
于 2013-01-23T17:25:55.990 に答える
3

あなたが持っていたものは非常に近く、2 番目の列のエイリアスを実際に指定する必要がありました。E.emailまた、ヌル列ではなくを選択したいと思いますusername(テーブルに再び参加する場合)

SELECT E.email,
    CASE
        WHEN EXISTS(SELECT * FROM UsersTbl tu WHERE E.email = tu.username) THEN 'Exist'
        ELSE 'Not Exist'
    END AS ex
FROM (VALUES('email1'),('email2'),('email3'),('email4')) E(email)

ただし、インポートされなかったメールのリストを取得するには、おそらく次のようにします。

SELECT E.email
FROM (VALUES('email1'),('email2'),('email3'),('email4')) E(email)
LEFT OUTER JOIN UsersTbl tu ON E.email = tu.username
WHERE tu.username IS NULL

または、

SELECT E.email
FROM (VALUES('email1'),('email2'),('email3'),('email4')) E(email)
WHERE NOT EXISTS
(
    SELECT 1
    FROM UsersTbl tu 
    WHERE E.email = tu.username
)
于 2013-01-23T17:27:10.670 に答える
0

それを完全に自動化する 1 つの方法は、openrowset を使用してスプレッドシートをデータベースとして使用することです。ただし、openrowset は許可されていない可能性があり、Excel ファイルはサーバー上にあるか、ネットワーク パス経由でアクセスできる必要があります。

ここに私が見つけた素晴らしいチュートリアルがあります スプレッドシート http://www.sql-programmers.com/tsql-openrowset-in-sql-server.aspx

Declare @UserTbl Table
(
    email nVarchar(255),
    firstname nVarchar(255),
    lastname nVarchar(255)
)

INSERT into @UserTbl VALUES('user1@email.com','User','1')
INSERT into @UserTbl VALUES('user2@email.com','User','2')
INSERT into @UserTbl VALUES('user3@email.com','User','3')

select *
from @UserTbl
where email not in (SELECT Email FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\email.xls;HDR=YES', 'SELECT * FROM [Feuil1$]')
)

-- Sample to read a file from Excel     SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\email.xls;HDR=YES', 'SELECT * FROM [Feuil1$]')
于 2013-01-23T18:49:10.023 に答える