Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果同时有(A,B)和(B,A),请仅选择一对_Sql_Sql Server_Select - Fatal编程技术网

Sql 如果同时有(A,B)和(B,A),请仅选择一对

Sql 如果同时有(A,B)和(B,A),请仅选择一对,sql,sql-server,select,Sql,Sql Server,Select,这里有一个简单的问题,当我有a,B作为我的查询结果时,我希望只有a,B,而不是B,a 例如,我的查询返回: 161, 52 161, 53 53, 161 53, 161 我的问题是: SELECT S1.SURVEY_ID, S2.SURVEY_ID FROM SURVEYS S1, SURVEYS S2 WHERE (S2.START_DATE BETWEEN S1.START_DATE and S1.END_DATE OR S2.END_DATE BETWEEN S1.

这里有一个简单的问题,当我有a,B作为我的查询结果时,我希望只有a,B,而不是B,a

例如,我的查询返回:

161, 52 
161, 53
53, 161
53, 161
我的问题是:

SELECT S1.SURVEY_ID, S2.SURVEY_ID

  FROM SURVEYS S1, SURVEYS S2

  WHERE (S2.START_DATE BETWEEN S1.START_DATE and S1.END_DATE
  OR S2.END_DATE BETWEEN S1.START_DATE and S1.END_DATE)
  AND S1.SURVEY_ID != S2.SURVEY_ID

ORDER BY S1.SURVEY_ID, S2.SURVEY_ID

可以使用条件排序,将每个集合A、B、B、A分组为一个组

SELECT MAX(S1.SURVEY_ID) as survey_id_1, MIN(S2.SURVEY_ID) as survey_id_2
FROM SURVEYS S1
INNER JOIN SURVEYS S2
 ON (S2.START_DATE BETWEEN S1.START_DATE and S1.END_DATE
     OR S2.END_DATE BETWEEN S1.START_DATE and S1.END_DATE)
WHERE S1.SURVEY_ID != S2.SURVEY_ID
GROUP BY CASE WHEN S1.SURVEY_ID > S2.SURVEY_ID
              THEN S1.SURVEY_ID
              ELSE S2.SURVEY_ID
         END
ORDER BY survey_id_1, survey_id_2
这将导致较大的调查,较小的调查-每组1个


我还将您的联接语法更改为联接的正确语法,请尽量避免使用隐式联接语法逗号分隔。

您可以使用条件排序,将每个集合a、B、B、a分组为一个组

SELECT MAX(S1.SURVEY_ID) as survey_id_1, MIN(S2.SURVEY_ID) as survey_id_2
FROM SURVEYS S1
INNER JOIN SURVEYS S2
 ON (S2.START_DATE BETWEEN S1.START_DATE and S1.END_DATE
     OR S2.END_DATE BETWEEN S1.START_DATE and S1.END_DATE)
WHERE S1.SURVEY_ID != S2.SURVEY_ID
GROUP BY CASE WHEN S1.SURVEY_ID > S2.SURVEY_ID
              THEN S1.SURVEY_ID
              ELSE S2.SURVEY_ID
         END
ORDER BY survey_id_1, survey_id_2
这将导致较大的调查,较小的调查-每组1个

我还将您的联接语法更改为联接的正确语法,请尽量避免使用隐式联接语法逗号分隔。

以下是一种方法:

WITH SS as (
      SELECT S1.SURVEY_ID as SURVEY_ID1, S2.SURVEY_ID as SURVEY_ID2
      FROM SURVEYS S1 JOIN
           SURVEYS S2
           ON (S2.START_DATE BETWEEN S1.START_DATE and S1.END_DATE OR
               S2.END_DATE BETWEEN S1.START_DATE and S1.END_DATE
              ) AND
              S1.SURVEY_ID <> S2.SURVEY_ID
     )
SELECT ss.*
FROM ss
WHERE SURVEY_ID1 < SURVEY_ID2
UNION ALL
SELECT ss.*
FROM ss
WHERE SURVEY_ID1 > SURVEY_ID2 AND
      NOT EXISTS (SELECT 1 FROM ss ss2 WHERE ss2.SURVEY_ID1 = ss.SURVEY_ID2 AND ss2.SURVEY_ID2 = ss.SURVEY_ID1);
但是,如果您只需要重叠调查,那么这将是适当的查询:

      SELECT S1.SURVEY_ID as SURVEY_ID1, S2.SURVEY_ID as SURVEY_ID2
      FROM SURVEYS S1 JOIN
           SURVEYS S2
           ON S2.START_DATE <= S1.END_DATE AND
              S2.END_DATE >= S1.START_DATE 
              S1.SURVEY_ID < S2.SURVEY_ID;
这里有一种方法:

WITH SS as (
      SELECT S1.SURVEY_ID as SURVEY_ID1, S2.SURVEY_ID as SURVEY_ID2
      FROM SURVEYS S1 JOIN
           SURVEYS S2
           ON (S2.START_DATE BETWEEN S1.START_DATE and S1.END_DATE OR
               S2.END_DATE BETWEEN S1.START_DATE and S1.END_DATE
              ) AND
              S1.SURVEY_ID <> S2.SURVEY_ID
     )
SELECT ss.*
FROM ss
WHERE SURVEY_ID1 < SURVEY_ID2
UNION ALL
SELECT ss.*
FROM ss
WHERE SURVEY_ID1 > SURVEY_ID2 AND
      NOT EXISTS (SELECT 1 FROM ss ss2 WHERE ss2.SURVEY_ID1 = ss.SURVEY_ID2 AND ss2.SURVEY_ID2 = ss.SURVEY_ID1);
但是,如果您只需要重叠调查,那么这将是适当的查询:

      SELECT S1.SURVEY_ID as SURVEY_ID1, S2.SURVEY_ID as SURVEY_ID2
      FROM SURVEYS S1 JOIN
           SURVEYS S2
           ON S2.START_DATE <= S1.END_DATE AND
              S2.END_DATE >= S1.START_DATE 
              S1.SURVEY_ID < S2.SURVEY_ID;

不确定我是否真的理解了这个问题。猜测:你希望A,B被视为B,A的复制品,并移除其中一个

将值按先高后低的顺序排列,然后可以使用distinct:

SELECT distinct 
  (CASE WHEN S1.SURVEY_ID > S2.SURVEY_ID THEN S1.SURVEY_ID ELSE S2.SURVEY_ID END) as "higher id",
  (CASE WHEN S1.SURVEY_ID > S2.SURVEY_ID THEN S2.SURVEY_ID ELSE S1.SURVEY_ID END) as "lower id"
...

不确定我是否真的理解了这个问题。猜测:你希望A,B被视为B,A的复制品,并移除其中一个

将值按先高后低的顺序排列,然后可以使用distinct:

SELECT distinct 
  (CASE WHEN S1.SURVEY_ID > S2.SURVEY_ID THEN S1.SURVEY_ID ELSE S2.SURVEY_ID END) as "higher id",
  (CASE WHEN S1.SURVEY_ID > S2.SURVEY_ID THEN S2.SURVEY_ID ELSE S1.SURVEY_ID END) as "lower id"
...

用您正在使用的数据库标记您的问题。还有,你想做什么?我猜这个查询并没有产生您真正想要的结果。如果您更改您的对于a?问题是什么?@StefanSteinegger我认为OP想要从查询结果中删除重复项,考虑到a,B相当于B,a,所以只有前两行应该显示为arbtw,重叠是不正确的,如果这是目的,那么您将缺少s1在s2中的那些。用您正在使用的数据库标记您的问题。还有,你想做什么?我猜这个查询并没有产生您真正想要的结果。如果您更改您的对于a?问题是什么?@StefanSteinegger我认为OP想要从查询结果中删除重复项,考虑到a,B相当于B,a,所以只有前两行应该显示为arbtw,重叠是不正确的,如果这是目的,那么s1在s2中的位置将丢失。