SQL比较行

时间:2015-04-25 18:12:39

标签: mysql sql sql-server compare

好的情况如下: 我在表格中列出了以下数据。

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列中的数字,但我认为这会产生相同的4行。

我可能会过度思考这个问题,也许有些人可以看看这个,看看解决方案隐藏在哪里。

我目前正在MySQL上测试它,但它应该在SQLServer 2008上运行。我搜索过但所有问题似乎都不符合我的数据集问题。

3 个答案:

答案 0 :(得分:0)

接受您的意思,即选择所有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
)

我个人更喜欢LEFT JOIN选项,因为它更短,更易读 这两个语句都应该适用于MySql和Sql Server。

答案 1 :(得分:0)

好的,我想感谢大家的帮助,但我想我解决了我的问题。花了我一秒钟,但我相信这就是我所追求的(SQL Server 2008):

menu

这将给我以下结果:

app.logger.setLevel(logging.INFO)

希望这可能有助于其他人。 享受。

答案 2 :(得分:0)

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