好的,情况是这样的:I在表格中提供以下数据。
PAIR_NO NO NO2
3 5678EFGH 1234ABCD
4 1111BBBB 0000AAAA
1 1234ABCD 5678EFGH
2 0000AAAA 1111BBBB
约束条件是,如果另一行中的 no = no2,则跳过该行。因此,在此示例数据中,唯一要选择的行应该是对号 3 和 4。
我尝试与自己合并和内部连接,但我只是不断恢复所有 4 行。
我试图插入到不存在的表中,但再次插入了 4 行。
SELECT a.* from PAIRS a
inner join PAIRS b on a.no=b.no2 and a.no2=b.no;
我在想也许从第 1 列中选择不同的数字,然后检查第 2 列中的数字,但我认为这将产生相同的四行。
我可能过度思考这个问题,也许这里的一些人可以看看这个,看看解决方案隐藏在哪里。
我目前正在MySQL上测试它,但它应该在SQLServer 2008上运行。我已经搜索过,但所有问题似乎都与我的数据集问题不匹配。
相信你的话,即选择no
列的值不出现在同一表no2
列中的任何位置的所有记录,请尝试以下操作:
SELECT A.PAIR_NO, A.NO, A.NO2
FROM PAIRS A
LEFT JOIN PAIRS B ON(A.NO = B.NO2)
WHERE B.PAIR_NO IS NULL -- assuming this column is not nullable
另一种选择是使用 NOT EXISTS
:
SELECT PAIR_NO, NO, NO2
FROM PAIRS A
WHERE NOT EXISTS(
SELECT 1
FROM PAIRS B
WHERE B.NO2 = A.NO
)
我个人更喜欢左加入选项,因为它更短,更具可读性。
这两个语句都应该在MySql和Sql Server上工作。
好的伙计们,我要感谢大家的帮助,但我想我解决了我的问题。花了我一秒钟,但我相信这就是我所追求的(SQL Server 2008):
if OBJECT_ID('tempdb..#pairs') is not null drop table #pairs
if OBJECT_ID('tempdb..#pairs_final') is not null drop table #pairs_final
create table #pairs(pair_no int, a_no varchar(17),a_no2 varchar(17))
create table #pairs_final(pair_no int Identity(1,1), a_no varchar(17),a_no2 varchar(17))
insert into #PAIRS values(1,'1234ABCD','5678EFGH');
insert into #PAIRS values(1,'1234ABCD','XXXX9999');
insert into #PAIRS values(2,'0000AAAA','1111BBBB');
insert into #PAIRS values(3,'5678EFGH','1234ABCD');
insert into #PAIRS values(4,'1111BBBB','0000AAAA');
insert into #PAIRS values(1,'XXXX9999','1234ABCD');
insert into #pairs_final
select a.a_no,a.a_no2 from #pairs a
join (
select distinct a_no_p from(
select pair_no,a_no_p,
ROW_NUMBER() over (partition by pair_no order by a_no_p) as RN
from #pairs
unpivot(
a_no_p for clms in (a_no2,a_no)
) as umpvt
) as mypairs
where RN = 1
) as my_pairs on my_pairs.a_no_p=a.a_no
select * from #pairs_final
这将给我以下结果:
pair_no a_no a_no2
1 1234ABCD 5678EFGH
2 1234ABCD XXXX9999
3 0000AAAA 1111BBBB
希望这可能会帮助其他人。享受。
DECLARE @TBL AS TABLE
(
[NO] INT,
[CODE] VARCHAR(50),
[AREA] VARCHAR(50)
)
/* EXAMPLE 1 */
INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (1,'001','A00')
INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (2,'001','A00')
INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (3,'001','B00')
INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (4,'001','C00')
INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (5,'001','C00')
INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (6,'001','A00')
INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (7,'001','A00')
/* EXAMPLE 2 */
/* ***** USE THIS CODE TO ENTER DATA FROM DIRECT TABLE *****
SELECT
ROW_NUMBER() OVER(ORDER BY [FIELD_DATE]) AS [NO]
,[FIELD_CODE] AS [CODE]
,[FIELD_AREA] AS [AREA]
FROM TABLE_A
WHERE CAST([FIELD_DATE] AS DATE) >= CAST('20200307' AS DATE)
ORDER BY [FIELD_DATE],[FIELD_CODE]
*/
SELECT
A.NO AS ANO
,A.CODE AS ACODE
,A.AREA AS AAREA
,B.NO AS BNO
,B.CODE AS BCODE
,B.AREA AS BAREA
,CASE WHEN A.AREA=B.AREA THEN 'EQUAL' ELSE 'NOT EQUAL' END AS [COMPARE AREA]
FROM @TBL A
LEFT JOIN @TBL B
ON A.NO=B.NO+1