[英]How to get missing values in sql?
我需要幫助。
我有一個與另外兩個表 t1 和 t3 相關的 sql 表 t2。
t2 有字段:
idFromt3 idFromt1 Value
1 14 text1
2 14 text2
1 44 text1
2 44 text2
3 44 text3
我正在尋找缺少 ifFromt3 的值。 我想在這個例子中找到值 ifFromt3 = 3,因為它不存在。
我正在像這個例子那樣做,但它不能正常工作。
SELECT t3.idFromt3, t3.idFromt1
FROM t3
INNER JOIN t2
ON t3.LanguageMessageCodeID <> t2.idFromt2
這是3張桌子。
CREATE TABLE [dbo].[t3](
[t3ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
)
CREATE TABLE [dbo].[t2](
[t2ID] [int] IDENTITY(1,1) NOT NULL,
[t3ID] [int] NOT NULL,
[t1ID] [int] NOT NULL,
)
CREATE TABLE [dbo].[t1](
[t1ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
)
更新:
數據表: http : //www.2shared.com/photo/40yY6FC-/Untitled.html
我需要一個查詢,它返回表LangugageMessageCodes 中所有缺失的組合。
在這種情況下:
LanguageMessageCodeID LanguageID
3 14
1 47
2 47
3 47
請。 幫助。
問候。
SELECT *
FROM t2
WHERE t2.idFromt3 NOT IN
(
SELECT LanguageMessageCodeID
FROM t3
)
或
SELECT *
FROM t2
WHERE NOT EXISTS
(
SELECT NULL
FROM t3
WHERE t3.LanguageMessageCodeID = t2.id
)
或
SELECT t2.*
FROM t2
LEFT JOIN
t3
ON t3.LanguageMessageCodeID = t2.id
WHERE t3.LanguageMessageCodeID IS NULL
更新:
試試這個:
SET NOCOUNT ON
DECLARE @t1 TABLE (id INT NOT NULL PRIMARY KEY)
DECLARE @t2 TABLE (t3id INT NOT NULL, t1id INT NOT NULL, PRIMARY KEY (t1id, t3id))
DECLARE @t3 TABLE (id INT NOT NULL)
INSERT
INTO @t1
VALUES (14)
INSERT
INTO @t1
VALUES (44)
INSERT
INTO @t2
VALUES (1, 14)
INSERT
INTO @t2
VALUES (2, 14)
INSERT
INTO @t2
VALUES (1, 44)
INSERT
INTO @t2
VALUES (2, 44)
INSERT
INTO @t2
VALUES (3, 44)
INSERT
INTO @t3
VALUES (1)
INSERT
INTO @t3
VALUES (2)
INSERT
INTO @t3
VALUES (3)
SELECT t1.id, t3.id
FROM @t1 t1
CROSS JOIN
@t3 t3
WHERE NOT EXISTS
(
SELECT NULL
FROM @t2 t2
WHERE t2.t1id = t1.id
AND t2.t3id = t3.id
)
如果要查找連接表中不存在的行,則需要使用LEFT OUTER JOIN
。
外連接將導致左表的所有行,無論右表是否存在匹配項。
為了過濾不存在的那些,您可以添加一個WHERE
子句檢查右表的NULL
值。
SELECT t3.idFromt3, t3.idFromt1
FROM t3
LEFT OUTER JOIN t2
ON t3.LanguageMessageCodeID <> t2.idFromt2
WHERE t2.idFromts IS NULL
通過采用這種方法解決了這個問題:
WITH Nums
AS
(
SELECT
1 AS Number
UNION ALL
SELECT
Number + 1
FROM
Nums
WHERE
Number < 99 --- Max number for Transactions it will count up to
), AccountLog (Account, TransNumber, NextTransNumber)
AS
(
SELECT --- Let's Generate some Sample Data
Account, --Pretend an Account with Transactions
TransNumber, --- Transaction Numbers which should be in sequence
LEAD(TransNumber,1,0) OVER (PARTITION BY Account ORDER BY TransNumber) NextCheckNumber
FROM (VALUES(1,2),
(100,1),---Pretend first column is the Account and then the Transaction Number (Which was Meant to be in Sequence)
(100,3),---As you can see we're missing numbers in sequence (1,3,7 and not 1,2,3,4,5,6,7)
(100,7),
(100,10),
(200,1),
(200,3),
(200,11),
(200,15)) a(Account,TransNumber)
),
MissingTrans (Account,TransNumber,TransDifference)
AS(
SELECT
Account,
TransNumber,
NextTransNumber-TransNumber as TransDifference
FROM AccountLog
WHERE
NextTransNumber<>0
AND
NextTransNumber-TransNumber<>1
)
SELECT
Account,
TransNumber+al.Number AS MissingTransNumber
FROM MissingTrans mt
CROSS JOIN Nums al
WHERE
al.Number<mt.TransDifference
AND
mt.TransNumber+al.Number>1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.